Ini adalah bagaimana saya pikir Anda dapat memiliki awal yang baik...
Pertama-tama, model dan migrasi Anda dapat menangani semuanya.
Ada untuk hubungan:Hubungan Laravel 5.2 Ada untuk migrasi:Migrasi Laravel 5.2
Jadi di sana Anda membuat migrasi Anda:
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();
});
Jadi, setelah Anda melakukan ini, Anda dapat membuat hubungan Anda menjadi model Anda. Dengan cara ini Anda tidak memerlukan semua tabel "antara". Saat Anda akan menggunakan associate(), Laravel akan membuatkan tautan untuk Anda. Dengan cara ini Anda dapat melakukan sesuatu seperti ini:$offer->store()->name untuk mendapatkan nama toko dari penawaran saat ini. Lihat:
Ke dalam model Toko
public function products()
{
return $this->hasMany(Product::class);
}
public function offers()
{
return $this->hasMany(Offer::class);
}
Ke dalam model Penawaran
public function store()
{
return $this->belongsTo(Store::class);
}
Dengan cara ini, Anda membuat hubungan satu-ke-banyak. Sudah saya katakan, $offer->store() akan mengambil toko penawaran. $store->offers()->get() akan mengambil semua penawaran toko.
Semoga membantu.
EDIT
Hanya ada satu masalah dengan apa yang saya katakan. n + 1 masalah . Jadi seperti itu jelaskan di sana (cari google "laravel n+1 problem" dan pilih tautan ke laracast) (tidak dapat menempatkannya sebagai tautan, reputasi tidak cukup), ketika Anda memanggil hal-hal seperti yang saya katakan, skrip akan melakukan 2 pertanyaan. Saat Anda menggunakan loop foreach(), kueri loop +1 akan memiliki sebanyak mungkin kueri. Saya menyarankan Anda untuk melakukan hal-hal seperti itu
$offers = Offer::with('store')->all();
Dengan cara ini Anda hanya akan memiliki 1 kueri dan Anda masih dapat melakukan
$offer->store;
tanpa melakukan kueri lain.
Saat Anda menggunakan $model =Model::with('something')->all();, kueri akan mengambil data dari 2 tabel dan mengembalikan hasilnya dengan array ke dalam array. Seperti ini:
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}}
}
Anda dapat menggunakan kebalikannya:
$stores = Store::with('offers')->all();
Jadi Anda dapat menggunakan:
$store->offers[i]->somthing;
Karena array akan terlihat seperti ini:
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}
}}
}