So denke ich, dass Sie einen guten Start haben können...
Zunächst einmal können Ihr Modell und Ihre Migration alles bewältigen.
Es gibt für Beziehung:Laravel 5.2 Relationship Für die Migration gibt es:Laravel 5.2 Migration
Dort erstellen Sie also Ihre Migration:
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();
});
Sobald Sie dies getan haben, können Sie Ihre Beziehung zu Ihrem Modell machen. Auf diese Weise brauchen Sie nicht alle "Zwischen"-Tabellen. Wenn Sie Associate() verwenden, erstellt Laravel den Link für Sie. Auf diese Weise können Sie etwa Folgendes tun:$Angebot->Geschäft()->Name, um den Namen des Geschäfts des aktuellen Angebots zu erhalten. Schau mal:
In Stores Modell
public function products()
{
return $this->hasMany(Product::class);
}
public function offers()
{
return $this->hasMany(Offer::class);
}
In das Angebotsmodell
public function store()
{
return $this->belongsTo(Store::class);
}
Auf diese Weise erstellen Sie eine Eins-zu-Viele-Beziehung. Wie gesagt, $offer->store() ruft den Store des Angebots ab. $store->offers()->get() ruft alle Angebote des Shops ab.
Hoffe es hilft.
BEARBEITEN
Es gibt nur ein Problem mit dem, was ich gesagt habe. Das n + 1-Problem . Also, wie es dort erklärt wird (google "laravel n+1 problem" suchen und den Link zu Laracast auswählen) (kann es nicht als Link setzen, nicht genug Reputation), wenn Sie die Dinge wie gesagt aufrufen, wird das Skript 2 tun Anfrage. Wenn Sie eine foreach () -Schleife verwenden, enthält sie so viele Schleifen +1-Abfragen. Ich empfehle Ihnen, solche Dinge zu tun
$offers = Offer::with('store')->all();
Auf diese Weise haben Sie nur eine Abfrage und können trotzdem
ausführen$offer->store;
ohne eine weitere Abfrage durchzuführen.
Wenn Sie $model =Model::with('something')->all(); verwenden, ruft die Abfrage Daten aus 2 Tabellen ab und gibt das Ergebnis mit einem Array in ein Array zurück. So:
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}}
}
Sie können das Gegenteil verwenden:
$stores = Store::with('offers')->all();
Sie können also verwenden:
$store->offers[i]->somthing;
Weil das Array so aussehen wird:
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}
}}
}