sql >> Database >  >> RDS >> Mysql

Relaties van modellen (Laravel 5.2)

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



  1. Oracle SQL - Hoe kan ik de ODCI-pijplijnfunctie aanroepen met JSP

  2. Correcte manier om invoer in MySQL op te schonen met behulp van PDO

  3. mysql AS-clausule

  4. Methode converteren. De opgegeven methode op het type kan niet worden vertaald in een LINQ to Entities store-expressie