Laravel 5.1(5) MongoDB多重Eloquent Relationship実践

準備:テスト用コレクション情報

まず、テスト用のコレクション(例)を用意します。

概要

・Collection種別は、上位から病院コレクション(hospitals)→診療科別コレクション(categories)→病気コレクション(diseases)
・Relatonship種別は、1:Mタイプ、親collectionの場合hasMany、子コレクションの場合belongsToに指定する
・Relatonship紐づけは、_id、category_id、disease_idに指定する、他デフォルト利用の場合もある

コレクションの構造と内容

$hospitals = App\Hospital::all()
=> Illuminate\Database\Eloquent\Collection {#977
     all: [
       App\Hospital{#999
         _id: MongoDB\BSON\ObjectId {#976
           +"oid": "5a7d0901f1a5e421d37a12e2",
         },
         name: "hospi",
         created_at: "2018-01-16 02:01:03",
         updated_at: MongoDB\BSON\UTCDateTime {#975
           +"milliseconds": "1518231495000",
         },
       },
    ],
   }
$categories = App\Category::all()
=> Illuminate\Database\Eloquent\Collection {#977
     all: [
       App\Category {#999
         _id: MongoDB\BSON\ObjectId {#976
           +"oid": "5a7d0901f1a5e421d37daac2",
         },
         hospital_id: "5a7d0901f1a5e421d37a12e2",
         name: "Nerve",
         created_at: "2018-01-16 02:01:03",
         updated_at: MongoDB\BSON\UTCDateTime {#975
           +"milliseconds": "1518231495000",
         },
       },
    ],
   }
$diseases = App\Disease::all()
=> Illuminate\Database\Eloquent\Collection {#977
     all: [
       App\Disease{#999
         _id: MongoDB\BSON\ObjectId {#976
           +"oid": "5a7d0901f1a5e421d37d090d0",
         },
         category_id: "5a7d0901f1a5e421d37daac2",
         name: "Cerebral Bleeding",
         created_at: "2018-01-16 02:01:03",
         updated_at: MongoDB\BSON\UTCDateTime {#975
           +"milliseconds": "1518231495000",
         },
       },
    ],
   }

Model構築

以下ソースにコメント割愛とします。

Hospital Model

class Hospital extends Eloquent
{
    protected $collection = 'hospitals';
    protected $connection = 'mongodb';
    protected $fillable = ['name' , 'description'];
    public function categories() 
    {
        return $this->hasMany('App\Category', 'hospital_id', '_id');
    }
}

Category Model

class Category extends Eloquent
{
    protected $collection = 'categories';
    protected $connection = 'mongodb';
    protected $fillable = ['hospital_id' , 'name' , 'description'];
    public function hospital() 
    {
        return $this->belongsTo('App\Hospital','hospital_id', '_id');
    }
    public function diseases() 
    {
        return $this->hasMany('App\Disease','category_id', '_id');
    }
}

Disease Model

class Diease extends Eloquent
{
    protected $collection = 'diseases';
    protected $connection = 'mongodb';
    protected $fillable = ['categoy_id' , 'name' , 'description'];
    public function category() 
    {
        return $this->belongsTo('App\Category','category_id', '_id');
    }
}

Collection作成

hospitals Collection

class CreateHospitalsCollection extends Migration
{
    public function up()
    {
        Schema::create('hospitals', function (Blueprint $collection) {
            $collection->string('name');
            $collection->string('description');
            $collection->timestamps();

         });
    }
    public function down()
    {
        Schema::drop('hospitals');
    }

categories Collection

class CreateCategoriesCollection extends Migration
{
    public function up()
    {
        Schema::create('categories', function (Blueprint $collection) {
            $collection->string('hospital_id');
            $collection->string('name');
            $collection->string('description');
            $collection->timestamps();
            $collection->foreign('hospital_id')
                       ->references('_id')
                       ->on('hospitals')
                       ->onDelete('cascade');
         });
    }
    public function down()
    {
        Schema::drop('categories');
    }

diseases Collection

class CreateDiseasesCollection extends Migration
{
    public function up()
    {
        Schema::create('diseases', function (Blueprint $collection) {
            $collection->string('category_id');
            $collection->string('name');
            $collection->string('description');
            $collection->timestamps();
            $collection->foreign('category_id')
                       ->references('_id')
                       ->on('categories')
                       ->onDelete('cascade');
         });
    }
    public function down()
    {
        Schema::drop('diseases');
    }

・DBに反映する。

composer dump-autoload
php artisan migrate:refresh --seed

Relationship検証

上位→下位の順にて参照また下位→上位の順にて参照

$ php artisan tinker

hospital→categories

>>>$hospitals = App\Hospital::all()
>>>$hospitals= hospitals->first()
>>>$category= $hospital->categories->first()

category->hospital

>>>$categories = App\Category::all()
>>>$category = $categories->first()
>>>$hospital = $category->hospital

category->disease

>>>$categories = App\Category::all()
>>>$category = $categories->first()
>>>$diseases = $category->diseases

disease->category

>>>$diseases = App\Disease::all()
>>>$disease = $diseases->first()
>>>$category = $disease->category

hospital→diseases

>>>$hospitals = App\Hospital::all()
>>>$hospital  = hospitals->first()
>>>$diseases = $hospital->categories->first()->diseases

disease->hospital

>>>$diseases = App\Disease::all()
>>>$disease = $diseases->first()
>>>$hospital= $disease->category->hospital

$hospital、$category、$diseaseがうまく表示されたら、紐付けができたことが検証済み。
Null、Errorが表示された場合、どこかで入力ミスあるか確認する。

上位から紐づけまた下位から紐づけして保存

>>>$hospital->categorys()->save($category)
>>>$category->diseases()->save($disease)

>>>$category->hospital()->associate($hospital)
>>>$disease->category()->associate($category)

以上。

研究開発・検証試作に提案するロボット翔・電子部品ストアロボット、センサ、通信モジュールが品揃えています。どうぞご利用下さい

Laravel 5.1(4) Text Field 動的増減&入力補完

Text Field 入力補完:Autocomplete

Javascript使用、別途route、Controller側にDB検索して、結果をjsonにて返すソースを追加必要ある(省略)。

<script type="text/javascript">
 
    $(function() {
         $( "#allergy" ).autocomplete({
          source: "{{ route('autoAllergy') }}",
          minLength: 1,
          select: function(event, ui) {
            $('#allergy').val(ui.item.value);
          }
         });
    });
></script>

Text Field 動的増減&入力補完:Dynamic Add/Remove

jQuery使用、動的増減&入力補完、入力補完のソースが動的増減ソースに埋め込む。別途blade側にjquery-ui.css、jQuery-2.1.4.min.js(他のバージョンでもよいか)、jquery-ui.js、またinputタグのclassなど追加必要ある(省略)。

<script type="text/javascript">
var $i = 0;
$(".addmore").on("click", function () {
if($i > 20) alert('注意:最大20行まで追加できます');
else  {
    $(".addform").append("<div class='input-group control-group' style='margin-top:20px;width: 100%;'><input class='form-control' id='item"+$i+"'  placeholder='削除は右側の-キーをクリックして下さい' name='value[]' type='text'><div class='input-group-btn'><button class='btn btn-default deleteform' type='button'><i class='fa fa-minus'></i></button></div></div>");            
    $( "#item"+$i).autocomplete({source: "{{ route('autoAllergy') }}", minLength: 1, select: function(event, ui) { $("#item"+$i).val(ui.item.value);} });
}
$i++;
});
$("body").on("click", ".deleteform", function () {
$(this).parent().parent().remove();
});
</script>

但し、views.allergys.createの際、AllergysController側storeで、validateの際、未入力か入力エラーのtext項目があった場合、create画面に戻って、動的増やしたtext fieldが表示されなくなる現象が確認した。別途、create1を作成するか、Inputにより分岐して、増やしたtext fieldを再描写するのか、手を施す必要がある。

研究開発・検証試作に提案するロボット翔・電子部品ストアロボット、センサ、通信モジュールが品揃えています。どうぞご利用下さい

Laravel5.1 (3) WebSocketについて

ChatやIoTリアルタイム処理にLaravel5のWebSocketが必要となります。以下の参考ベースがあります。

1、Ratchetライブラリ:https://github.com/ratchetphp/Ratchet

2、laravel 5.2 chat

3、github.com/assertchris/laravel4 リアルタイムchat

4、ライブラリ:github.com/BrainBoxLabs/brain-socket

5、socket IO:www.codetutorial.io/laravel-5-and-socket-io-tutorial/

6、AJAX&laravel 4:https://www.youtube.com/watch?v=GLDjgbbBvOg

以上。

研究開発・検証試作に提案するロボット翔・電子部品ストアロボット、センサ、通信モジュールが品揃えています。どうぞご利用下さい

Laravel5.1(2)Windows7+Xamppでスタート

Laravel5本家が推奨している、開発プラットホームはVirtualBox+Vagrant+HomeSteadの組み合わせです。以前はPHPでの開発でXamppの環境が構築できたのでそのまま流用していきます。

続きを読む Laravel5.1(2)Windows7+Xamppでスタート

研究開発・検証試作に提案するロボット翔・電子部品ストアロボット、センサ、通信モジュールが品揃えています。どうぞご利用下さい

Laravel5.1(1)スタートコンテンツ

数多くのPHPフレームワークの中、この2年間、Laravelが人気FWとして注目されています。GitHub、PackalystにLaravel関連のリポジトリが活発に寄せられている状況です。ルーティング、ルーティングフィルター・Middleware、Eloquent ORMデータベース・オブジェクトマッピング、オートローダー、RESTful、IOC制御反転・DI依存注入、コンポーサー、サービスコンテンナ、MVCなどモダンな開発技法が盛り込まれるにより、開発スピード向上、チームワーク利便性に繋がります。2015年5月にLTS 5.1がリリースされ、長期間保守バージョンになったようです。これで安心してビジネスに取り組むことができるようになりました。また、オーバーヘッドを軽減するために、Laravelのコンパクトバージョンとして、Lumen5との軽量フレームワークもリリースされています。

続きを読む Laravel5.1(1)スタートコンテンツ

研究開発・検証試作に提案するロボット翔・電子部品ストアロボット、センサ、通信モジュールが品揃えています。どうぞご利用下さい