web-dev-qa-db-fra.com

Laravel les relations dans les migrations?

Je sais que vous pouvez définir les relations de table assez facilement avec $this->belongs_to(), $this->has_many() etc., mais ce que je ne comprends pas, c'est comment la table de relations est créée; la table qui relie les deux tables ensemble (j'ai oublié comment s'appelle le terme).

Disons que je crée une table d'utilisateurs. Je veux que cet utilisateur appartienne à un certain "rôle". Il existe plusieurs rôles et chaque rôle peut avoir plusieurs utilisateurs. Je devrai également créer une table roles pour cela. Jusqu'ici tout va bien.

Mais après avoir lu la documentation, cela signifie que je devrais ajouter la $this->belongs_to() dans le modèle, pas la migration elle-même. Quand et comment la table de relations est-elle créée? Si je crée les tables roles et users et que je ajoute $this->belongs_to('roles') au modèle users et à $this->has_many('users') au modèle roles, la table du milieu sera-t-elle créée automatiquement?

19
qwerty

Pour autant que je sache, aucune table de relation ne sera créée. Ce que vous devez faire est d’avoir un role_id dans votre table users, de sorte que lorsque vous créez un utilisateur, l’ID du rôle y soit stocké. Cela vous permettra de sélectionner tous les utilisateurs où role_id == '1' ou quoi que ce soit. Par exemple:

$admins = User::where('role_id', '=', 1);

Là où, dans la table ROLES, l'enregistrement avec ID='1' est admin . Ainsi, pour répondre à votre question, aucune table de relations n'est créée. La relation existe dans vos deux tables sous la forme d'une colonne role_id pour chaque utilisateur. Par intérêt, utilisez-vous des clés étrangères? 

Si vous voulez avoir une table de relations, vous pouvez en créer une appelée user_roles ou quelque chose comme ça et y stocker les role_id et user_id, mais je pense qu'il est plus facile d'utiliser la méthode ci-dessus, vous pouvez alors utiliser toute la qualité Laravel/Eloquent.

J'espère que cela t'aides :)

1
gregchapple

Lors de la création d'une migration, vous pouvez spécifier des clés étrangères sur vos tables, à savoir

public function up()
{
    Schema::table('roles', function(Blueprint $table) {
        $table->increments('id');
        $table->integer('user_id')->unsigned();
        //rest of fields then...
        $table->foreign('user_id')->references('id')->on('users');
    });
}

Cela créera une clé étrangère sur la colonne user_id de la table de rôles . Les avantages des clés étrangères sont que, lorsqu'une mise à jour ou une suppression est effectuée, la table de clé étrangère est automatiquement mise à jour ou "en cascade". Description géniale trouvée ici

Comme décrit dans la documentation de Laravel, vous pouvez également spécifier votre cascade lors de la mise à jour à l'aide de la syntaxe suivante

$table->foreign('user_id')
  ->references('id')->on('users')
  ->onDelete('cascade');

Je ferais un mauvais travail en essayant de l'expliquer mieux que la documentation. Veuillez donc lire attentivement la section "Relations" de la documentation Eloquent ORM pour voir comment elle fonctionne.

38
Roark

Il semble que certaines des questions initiales n’aient jamais reçu de réponse, à savoir "Quand et comment la table de relations est-elle créée" et "la table du milieu sera créée automatiquement":

Autant que je sache, ces tables doivent être créées manuellement. Créez donc le fichier de migration comme suit:

Laravel 5

php artisan make:migration create_role_user_table

Laravel 4

php artisan migrate:make create_role_user_table

Notez que les noms sont singuliers et sont présentés par ordre alphabétique.

Puis dans la migration, quelque chose comme:

public function up()
{
    Schema::create('role_user', function($table) {
        $table->increments('id');
        $table->integer('role_id');
        $table->integer('user_id');
        $table->timestamps();
    });
}

J'espère que cela pourra aider. Je ne sais pas si les horodatages sont nécessaires dans les tableaux croisés dynamiques ou non, veuillez donc essayer.

14
Mere Development

Bien que ce soit un ancien poste, je pense pouvoir apporter une mise à jour. Pour Laravel5, Jeffrey Way a développé un package Laravel5 Generators-extended qui améliore la capacité de génération de php artisan pour

  • make:migration:schema
  • make:migration:pivot
  • make:seed

Pour une relation plusieurs à plusieurs entre les utilisateurs et le rôle, vous pouvez simplement utiliser 

php artisan make:migration:pivot users role

et il générera la classe de migration requise. Vous n'avez pas besoin de coder manuellement pour cela.

10
Ariful Haque

Je sais que c’est un vieux post, mais j’avais la même question à l’esprit. J'ai trouvé la solution dans le manuel Laravel (5.0) où il est décrit que pour cette relation plusieurs à plusieurs, vous pouvez créer la table manuellement, puis déclarer le type de relation dans Modèle. de cette façon:

return $this -> belongsToMany('App\<Model>', '<table_created_manually>');

ou si vous souhaitez utiliser des clés associées spécifiques:

return $this -> belongsToMany('App\<Model>', '<rel_table1_table2>' '<table1>_id', '<table2>_id');

J'espère que cela peut aider.

0
Lino

Cette vidéo m'a aidé. 

https://laracasts.com/series/laravel-5-fundamentals/episodes/14

Ce qui était étonnant pour moi, c’est qu’un seul des côtés de la relation a besoin de pointer_id dans la table de migration, pas des deux. Par exemple, si nous avons Auteur avec plusieurs articles, nous n’ajoutons que 

$table->integer('author_id')

à la migration d'article et c'est tout.

0
pera