sql >> Databasteknik >  >> RDS >> Mysql

Relationer mellan modeller (Laravel 5.2)

Så här tror jag att du kan få en bra start...

Först och främst kan din modell och migrering hantera allt.

Det finns för relation:Laravel 5.2 Relationship Det finns för migrering:Laravel 5.2 Migration

Så där skapar du din migrering:

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

Så när du väl har gjort detta kan du göra ditt förhållande till din modell. På så sätt behöver du inte alla "mellan" bord. När du kommer att använda associate(), kommer Laravel att skapa länken åt dig. På så sätt kan du göra något så här:$offer->store()->name för att få namnet på butiken för det aktuella erbjudandet. Ta en titt:

Into Stores modell

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

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

Into Offers modell

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

På så sätt skapar du en en-till-många-relation. Har jag sagt, $offer->store() kommer att hämta butiken för erbjudandet. $store->offers()->get() kommer att hämta alla erbjudanden från butiken.

Hoppas det hjälper.

REDIGERA

Det finns bara ett problem med det jag sa. n + 1-problemet . Så låt det förklara där (sök på google "laravel n+1 problem" och välj länken till laracast) (kan inte sätta det som en länk, inte tillräckligt rykte) , när du kallar saker som jag sa, kommer skriptet att göra 2 fråga. När du använder en foreach()-loop kommer den att ha lika mycket loop +1-fråga. Jag föreslår att du gör sådana saker

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

På så sätt har du bara en fråga och du kan fortfarande göra

$offer->store;

utan att göra en annan fråga.

När du använder $model =Model::with('något')->all();, kommer frågan att hämta data från tabell 2 och returnera resultatet med en array till en array. Så här:

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

Du kan använda motsatsen:

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

Så du kan använda:

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

Eftersom arrayen kommer att se ut så här:

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. MySqlDataReader GetBytes buffertproblem...

  2. Konvertera en bit av SQL till en Oracle-funktion

  3. Laravel 4 kan inte köra hela RAW-frågor

  4. Frågan tar väldigt lång tid första gången den körs