これがあなたが良いスタートを切ることができると私が思う方法です...
まず第一に、モデルと移行ですべてを処理できます。
関係があります: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}
}}
}