Zo denk ik dat je een goede start kunt maken...
Allereerst kunnen uw model en migratie alles aan.
Er is voor relatie:Laravel 5.2 Relatie Er is voor migratie:Laravel 5.2-migratie
Dus daar maak je je migratie aan:
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();
});
Dus als je dit eenmaal hebt gedaan, kun je je relatie tot je model maken. Op deze manier heb je niet alle "tussen" tabellen nodig. Wanneer u associate() gebruikt, maakt Laravel de link voor u. Op deze manier kun je zoiets als dit doen:$offer->store()->name om de naam van de winkel van de huidige aanbieding te krijgen. Kijk eens:
Into Store's model
public function products()
{
return $this->hasMany(Product::class);
}
public function offers()
{
return $this->hasMany(Offer::class);
}
Naar het model van de aanbieding
public function store()
{
return $this->belongsTo(Store::class);
}
Zo creëer je een één-op-veel relatie. Heb ik al gezegd, $offer->store() haalt de winkel van de aanbieding op. $store->offers()->get() haalt alle aanbiedingen van de winkel op.
Ik hoop dat het helpt.
BEWERKEN
Er is alleen een probleem met wat ik zei. Het n + 1 probleem . Dus zoals het daar uitlegt (zoek google "laravel n+1 problem" en kies de link naar laracast) (kan het niet als een link plaatsen, niet genoeg reputatie), als je dingen noemt zoals ik al zei, zal het script 2 doen vraag. Wanneer u een foreach()-lus gebruikt, heeft deze evenveel lus +1-query. Ik raad je aan om dat soort dingen te doen
$offers = Offer::with('store')->all();
Op deze manier heb je maar 1 vraag en kun je nog steeds
$offer->store;
zonder nog een zoekopdracht te doen.
Wanneer u $model =Model::with('something')->all(); gebruikt, haalt de query gegevens op uit 2 tabellen en retourneert het resultaat met een array in een array. Zoals dit:
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}}
}
U kunt het tegenovergestelde gebruiken:
$stores = Store::with('offers')->all();
U kunt dus het volgende gebruiken:
$store->offers[i]->somthing;
Omdat de array er zo uit zal zien:
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}
}}
}