Myślę, że w ten sposób możesz mieć dobry początek...
Przede wszystkim Twój model i migracja mogą to wszystko obsłużyć.
Istnieje związek:Związek Laravel 5.2 Jest do migracji:Migracja Laravel 5.2
Więc tam tworzysz swoją migrację:
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();
});
Więc kiedy już to zrobisz, możesz zmienić swój związek na swój model. W ten sposób nie potrzebujesz wszystkich „pomiędzy” stołami. Kiedy użyjesz Associate(), Laravel utworzy dla Ciebie link. W ten sposób możesz zrobić coś takiego:$offer->store()->name, aby uzyskać nazwę sklepu z aktualną ofertą. Spójrz:
Do modelu sklepu
public function products()
{
return $this->hasMany(Product::class);
}
public function offers()
{
return $this->hasMany(Offer::class);
}
Do modelu oferty
public function store()
{
return $this->belongsTo(Store::class);
}
W ten sposób tworzysz relację jeden-do-wielu. Jak już powiedziałem, $offer->store() pobierze sklep z ofertą. $store->offers()->get() pobierze całą ofertę sklepu.
Mam nadzieję, że to pomoże.
EDYTUJ
Jest tylko jeden problem z tym, co powiedziałem. Problem n + 1 . Więc tak jak to wyjaśniono (wyszukaj w google "laravel n+1 problem" i wybierz link do laracast) (nie można umieścić go jako linku, za mało reputacji) , kiedy nazwiesz rzeczy takie, jak powiedziałem, skrypt zrobi 2 zapytanie. Kiedy używasz pętli foreach(), będzie ona miała tyle samo zapytań pętli +1. Proponuję robić takie rzeczy
$offers = Offer::with('store')->all();
W ten sposób będziesz mieć tylko 1 zapytanie i nadal będziesz mógł to zrobić
$offer->store;
bez wykonywania kolejnego zapytania.
Kiedy użyjesz $model =Model::with('something')->all();, zapytanie pobierze dane z 2 tabeli i zwróci wynik z tablicą do tablicy. Tak:
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}}
}
Możesz użyć przeciwnego:
$stores = Store::with('offers')->all();
Możesz więc użyć:
$store->offers[i]->somthing;
Ponieważ tablica będzie wyglądać tak:
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}
}}
}