Mysql
 sql >> Database >  >> RDS >> Mysql

Relazioni dei modelli (Laravel 5.2)

È così che penso che tu possa iniziare bene...

Prima di tutto, il tuo modello e la tua migrazione possono gestire tutto.

C'è per la relazione:Laravel 5.2 Relazione C'è per la migrazione:Laravel 5.2 Migration

Quindi lì crei la tua migrazione:

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

Quindi, una volta fatto questo, puoi trasformare la tua relazione nel tuo modello. In questo modo non hai bisogno di tutte le tabelle "tra". Quando utilizzerai associate(), Laravel creerà il collegamento per te. In questo modo puoi fare qualcosa del genere:$offer->store()->name per ottenere il nome del negozio dell'offerta corrente. Dai un'occhiata:

Nel modello del negozio

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

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

Nel modello dell'offerta

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

In questo modo crei una relazione uno-a-molti. Ho già detto, $offer->store() recupererà il negozio dell'offerta. $store->offers()->get() recupererà tutte le offerte del negozio.

Spero che ti aiuti.

MODIFICA

C'è un unico problema con quello che ho detto. Il problema n + 1 . Quindi come spiega lì (cerca su google "problema laravel n + 1" e scegli il link a laracast) (non posso metterlo come link, non abbastanza reputazione), quando chiami cose come ho detto, lo script farà 2 interrogazione. Quando usi un ciclo foreach(), avrà la stessa query di ciclo +1. Ti suggerisco di fare cose del genere

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

In questo modo avrai solo 1 query e potrai comunque fare

$offer->store;

senza fare un'altra query.

Quando usi $model =Model::with('something')->all();, la query recupererà i dati da 2 tabelle e restituirà il risultato con un array in un array. In questo modo:

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

Puoi usare il contrario:

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

Quindi puoi usare:

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

Perché l'array sarà simile a questo:

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