Sådan tror jeg, du kan få en god start...
Først og fremmest kan din model og migration klare det hele.
Der er for forholdet:Laravel 5.2 Relationship Der er til migrering:Laravel 5.2 Migration
Så der opretter du din migrering:
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();
});
Så når du først har gjort dette, kan du gøre dit forhold til din model. På denne måde behøver du ikke alle "mellem" borde. Når du vil bruge associate(), vil Laravel oprette linket for dig. På denne måde kan du gøre noget som dette:$offer->store()->name for at få navnet på butikken for det aktuelle tilbud. Tag et kig:
Ind i butikkens model
public function products()
{
return $this->hasMany(Product::class);
}
public function offers()
{
return $this->hasMany(Offer::class);
}
Into Offers model
public function store()
{
return $this->belongsTo(Store::class);
}
På denne måde skaber du en en-til-mange relation. Har jeg sagt, $offer->store() vil hente butikken af tilbuddet. $store->offers()->get() vil hente alle tilbud fra butikken.
Håber det hjælper.
REDIGER
Der er kun et problem med det, jeg sagde. n + 1-problemet . Så forklar det der (søg på google "laravel n+1 problem" og vælg linket til laracast) (kan ikke sætte det som et link, ikke nok ry), når du kalder ting som jeg sagde, vil scriptet gøre 2 forespørgsel. Når du bruger en foreach()-løkke, vil den have lige så meget loop +1-forespørgsel. Jeg foreslår, at du gør sådan noget
$offers = Offer::with('store')->all();
På denne måde har du kun 1 forespørgsel, og du vil stadig være i stand til at gøre
$offer->store;
uden at foretage en anden forespørgsel.
Når du bruger $model =Model::with('noget')->all();, vil forespørgslen hente data fra 2 tabel og returnere resultatet med et array til et array. Sådan:
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}}
}
Du kan bruge det modsatte:
$stores = Store::with('offers')->all();
Så du kan bruge:
$store->offers[i]->somthing;
Fordi arrayet vil se sådan ud:
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}
}}
}