Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Beziehungen von Modellen (Laravel 5.2)

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}
                        }}
}