sql >> データベース >  >> RDS >> Mysql

モデルの関係(Laravel 5.2)

    これがあなたが良いスタートを切ることができると私が思う方法です...

    まず第一に、モデルと移行ですべてを処理できます。

    関係があります:Laravel5.2関係 移行のためにあります:Laravel5.2移行

    そこで、移行を作成します:

    Schema::create('stores', function (Blueprint $table) {
        $table->bigIncrements('id')->unsigned();
        $table->string('name', 50);
        $table->timestamps();
    });
    
    Schema::create('items', function (Blueprint $table) {
        $table->bigIncrements('id')->unsigned();
        $table->bigInteger('user_id')->unsigned();
        $table->foreign('user_id')->references('id')->on('users');
        $table->text('title');
        $table->longText('content');
        $table->timestamps();
    });
    
    Schema::create('products', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->bigInteger('store_id')->unsigned();
        $table->foreign('store_id')->references('id')->on('stores');
        $table->decimal('reviews', 7,1);
        $table->timestamps();
    });
    
    Schema::create('offers', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->bigInteger('store_id')->unsigned();
        $table->foreign('store_id')->references('id')->on('stores');
        $table->bigInteger('item_id')->unsigned();
        $table->foreign('item_id')->references('id')->on('items');
        $table->decimal('price', 7,2);
        $table->string('url', 255);
        $table->dte('start_date');
        $table->dte('end_date');
        $table->timestamps();
    });
    

    したがって、これを実行すると、モデルに関係を築くことができます。このように、すべての「間」テーブルは必要ありません。 associate()を使用すると、Laravelがリンクを作成します。このようにして、次のようなことができます。$ offer-> store()-> nameを使用して、現在のオファーのストアの名前を取得します。ご覧ください:

    ストアのモデルに

    public function products()
    {
        return $this->hasMany(Product::class);
    }
    
    public function offers()
    {
        return $this->hasMany(Offer::class);
    }
    

    オファーのモデルに

    public function store()
    {
        return $this->belongsTo(Store::class);
    }
    

    このようにして、1対多の関係を作成します。私が言ったように、$ offer-> store()はオファーのストアを取得します。 $ store-> offers()-> get()は、ストアのすべてのオファーを取得します。

    お役に立てば幸いです。

    編集

    私が言ったことにはただ一つの問題があります。 n+1の問題 。そこで説明しているように(google "laravel n + 1の問題"を検索してlaracastへのリンクを選択してください)(リンクとして配置できない、評判が悪い)、私が言ったように呼び出すと、スクリプトは2を実行しますクエリ。 foreach()ループを使用すると、ループ+1クエリと同じ数になります。そのようなことをすることをお勧めします

    $offers = Offer::with('store')->all();
    

    このようにすると、クエリは1つだけになり、引き続き実行できます

    $offer->store;
    

    別のクエリを実行せずに。

    $ model =Model ::with('something')-> all();を使用すると、クエリは2つのテーブルからデータをフェッチし、配列を含む結果を配列に返します。このように:

    offers {
        [0]:{a,b,c,d,e, store{a,b,c,d,e}}
        [1]:{a,b,c,d,e, store{a,b,c,d,e}}
        [2]:{a,b,c,d,e, store{a,b,c,d,e}}
        [3]:{a,b,c,d,e, store{a,b,c,d,e}}
    }
    

    反対の方法を使用できます:

    $stores = Store::with('offers')->all();
    

    したがって、次を使用できます:

    $store->offers[i]->somthing;
    

    配列は次のようになるため:

    stores {
        [0]:{a,b,c,d,e, offers{
                            [0]:{a,b,c,d,e}
                            [1]:{a,b,c,d,e}
                            [2]:{a,b,c,d,e}
                            [3]:{a,b,c,d,e}
                            }}
        [1]:{a,b,c,d,e, offers{
                            [0]:{a,b,c,d,e}
                            [1]:{a,b,c,d,e}
                            [2]:{a,b,c,d,e}
                            [3]:{a,b,c,d,e}
                            }}
        [2]:{a,b,c,d,e, offers{
                            [0]:{a,b,c,d,e}
                            [1]:{a,b,c,d,e}
                            [2]:{a,b,c,d,e}
                            [3]:{a,b,c,d,e}
                            }}
    }
    



    1. Oracle制約データ型

    2. SQLAlchemyでパーティション化されたOracleテーブルを作成するにはどうすればよいですか?

    3. オラクルヘルプコンマがありません

    4. おそらくあなたが知らないマイクロソフトについての6つのおもしろ情報!