Mysql
 sql >> Base de données >  >> RDS >> Mysql

Relations des modèles (Laravel 5.2)

C'est ainsi que je pense que vous pouvez prendre un bon départ...

Tout d'abord, votre modèle et votre migration peuvent tout gérer.

Il y a pour la relation :Relation Laravel 5.2 Il y a pour la migration :Laravel 5.2 Migration

Alors là, vous créez votre 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();
});

Donc, une fois que vous avez fait cela, vous pouvez créer votre relation sur votre modèle. De cette façon, vous n'avez pas besoin de toutes les tables "entre". Lorsque vous utiliserez Associate(), Laravel créera le lien pour vous. De cette façon, vous pouvez faire quelque chose comme ceci :$offer->store()->name pour obtenir le nom du magasin de l'offre actuelle. Jetez un œil :

Dans le modèle du magasin

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

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

Dans le modèle de l'offre

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

De cette façon, vous créez une relation un-à-plusieurs. Ai-je dit, $offer->store() va récupérer la boutique de l'offre. $store->offers()->get() récupérera toutes les offres du magasin.

J'espère que cela vous aidera.

MODIFIER

Il y a un seul problème avec ce que j'ai dit. Le problème n + 1 . Donc, comme il explique là (recherchez google "problème laravel n + 1" et choisissez le lien vers laracast) (ne peut pas le mettre comme lien, pas assez de réputation), quand vous appelez des choses comme je l'ai dit, le script fera 2 requête. Lorsque vous utilisez une boucle foreach(), elle aura autant de requête boucle +1. Je vous suggère de faire des choses comme ça

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

De cette façon, vous n'aurez qu'une seule requête et vous pourrez toujours faire

$offer->store;

sans faire une autre requête.

Lorsque vous utilisez $model =Model::with('something')->all();, la requête récupère les données de 2 tables et renvoie le résultat avec un tableau dans un tableau. Comme ceci :

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

Vous pouvez utiliser le contraire :

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

Vous pouvez donc utiliser :

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

Parce que le tableau ressemblera à ceci :

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