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)

以上。

0

ロボット・ドローン部品お探しなら
ROBOT翔・電子部品ストア

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を再描写するのか、手を施す必要がある。

0

ロボット・ドローン部品お探しなら
ROBOT翔・電子部品ストア

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

以上。

0

ロボット・ドローン部品お探しなら
ROBOT翔・電子部品ストア

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

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

1、Composerのインストール

PHPシステムの依存かんきょうを管理してくれるツール(dependency management tool)であるComposer Installerを以下リンクよりダウンロードして、インストールします。※php.exeの置き場を指定する必要があります。

https://getcomposer.org/download/

 2、Laravelのインストール

Laravelの公式サイトへインストールに関する説明を読みます。

http://laravel.com/docs/5.1

プロジェクトを作成コマンドでLaravelをインストールします。

c:>cd c:/xampp/hotdocs
c:/xampp/hotdocs>composer create-project laravel/laravel laravel5.1

3、Xampp Contrl Panelを開いて、ApacheおよびMySQLを起動

4、インストールしたLaravelをブラウザで確認

http://localhost/laravel5.1/public
0

ロボット・ドローン部品お探しなら
ROBOT翔・電子部品ストア

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

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

Laravel関連スタートコンテンツ

・公式サイト(本家) http://laravel.com/、http://lumen.laravel.com/、日本語サイトは、http://laravel.jp/、http://laravel.tokyo/
・日本語版ドキュメント(翻訳者:川瀬裕久氏) http://readouble.com/、初心者には、おすすめです。
・先輩たちが作ったパッケージ http://packalyst.com/packages/、https://github.com/
・英語版学習コンテンツ(一部有料) https://laracasts.com/、無料なのはこちら→ https://laracasts.com/series/laravel-5-fundamentals/episodes/1
また、こちらのコンテンツはとても簡潔で、分かりやすい英語で書かれています→ https://scotch.io/tag/laravel、初心者には、おすすめです。
・日本語版学習コンテンツ https://laravel10.wordpress.com/、初心者には、おすすめです。
・日本語版の書籍も出版されています。「Laravelエキスパート養成読本」。書名のよおりエキスパート養成のための本ですので、PHPフレームワークに関する基本知識のある方に最適かもしれません。

0

ロボット・ドローン部品お探しなら
ROBOT翔・電子部品ストア