sql >> Databáze >  >> RDS >> Mysql

Vztahy modelů (Laravel 5.2)

Takto si myslím, že můžete začít dobře...

Za prvé, váš model a migrace to všechno zvládnou.

Existuje vztah:Vztah Laravel 5.2 Existuje pro migraci:Migrace Laravel 5.2

Zde tedy vytvoříte migraci:

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();
});

Takže jakmile to uděláte, můžete svůj vztah přeměnit na svůj model. Tímto způsobem nepotřebujete všechny „mezi“ tabulky. Když použijete přidružení(), Laravel vytvoří odkaz za vás. Tímto způsobem můžete udělat něco takového:$offer->store()->name pro získání názvu obchodu s aktuální nabídkou. Podívejte se:

Do modelu obchodu

public function products()
{
    return $this->hasMany(Product::class);
}

public function offers()
{
    return $this->hasMany(Offer::class);
}

Do nabídky modelu

public function store()
{
    return $this->belongsTo(Store::class);
}

Tímto způsobem vytvoříte vztah jeden k mnoha. Řekl jsem, $offer->store() načte úložiště nabídky. $store->offers()->get() načte veškerou nabídku obchodu.

Doufám, že to pomůže.

UPRAVIT

S tím, co jsem řekl, je jediný problém. Problém n + 1 . Tak jako to tam vysvětlete (hledejte na google "laravel n+1 problem" a vyberte odkaz na laracast) (nelze to dát jako odkaz, nedostatečná reputace), když zavoláte věci, jak jsem řekl, skript udělá 2 dotaz. Když použijete smyčku foreach(), bude mít stejný počet dotazů smyčky +1. Doporučuji vám dělat takové věci

$offers = Offer::with('store')->all();

Tímto způsobem budete mít pouze 1 dotaz a stále budete moci dělat

$offer->store;

bez dalšího dotazu.

Když použijete $model =Model::with('něco')->all();, dotaz načte data z tabulky 2 a vrátí výsledek s polem do pole. Takhle:

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

Můžete použít opak:

$stores = Store::with('offers')->all();

Můžete tedy použít:

$store->offers[i]->somthing;

Protože pole bude vypadat takto:

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. Jak funguje funkce Degrees() v PostgreSQL

  2. Case Expression vs Case Statement

  3. Dezinfekce při ukládání serializovaného pole

  4. Připojení k Microsoft Access v IRI Workbench