web-dev-qa-db-fra.com

hasMany vs appartientToMany dans laravel 5.x

Je suis curieux de savoir pourquoi la relation Eloquent pour hasMany a une signature différente de celle pour belongsToMany. Plus précisément, le nom de la table de jointure personnalisée - pour un système où un Comment donné appartient à plusieurs Roles, et un Role donné aurait plusieurs Comments, I vouloir stocker la relation dans une table appelée my_custom_join_table et que les touches soient configurées comme comment_key et role_key.

return $this->belongsToMany('App\Role', 'my_custom_join_table', 'comment_key', 'role_key'); // works

Mais à l'inverse, je ne peux pas définir ce tableau personnalisé (au moins, la documentation ne le mentionne pas):

return $this->hasMany('App\Comment', 'comment_key', 'role_key');

Si j'ai un objet Role qui hasManyComments, mais que j'utilise un nom de table non standard pour stocker cette relation, pourquoi puis-je utiliser cette table non standard chemin mais pas l'autre?

37
user101289

hasMany est utilisé dans une relation n à plusieurs tandis que belongsToMany fait référence à une relation plusieurs à plusieurs . Ces deux types de relations sont distincts et nécessitent chacun une structure de base de données différente. Ils utilisent donc des paramètres différents.

La principale différence est que, dans une relation un à plusieurs, vous n'avez besoin que des deux tables de base de données correspondant aux modèles associés. En effet, la référence à la relation est stockée dans la table du modèle appartenant. Par exemple, vous pourriez avoir un modèle Country et un modèle City. Un pays a beaucoup de villes. Cependant, chaque ville n'existe que dans un pays. Par conséquent, vous stockeriez ce pays sur le modèle de ville lui-même (comme country_id ou quelque chose comme ça).

Toutefois, une relation plusieurs à plusieurs requiert une table de base de données tiers, appelée tableau croisé dynamique . Le tableau croisé dynamique stocke les références aux deux modèles et vous pouvez le déclarer en tant que second paramètre dans la déclaration de relation. Par exemple, imaginons que vous ayez votre modèle City et que vous disposiez également d'un modèle Car. Vous voulez une relation montrant les types de voitures que les gens conduisent dans chaque ville. Eh bien, dans une ville, les gens conduiront beaucoup différents types de voitures. Cependant, si vous regardez un type de voiture, vous saurez également qu'il est possible de conduire dans plusieurs villes différentes. Par conséquent, il serait impossible de stocker un city_id ou un car_id sur l'un ou l'autre modèle, car chacun en aurait plus d'un. Par conséquent, vous mettez ces références dans le tableau croisé dynamique.

En règle générale, si vous utilisez une relation belongsToMany, elle peut seulement être associée à une autre relation belongsToMany et signifie que vous disposez d'un troisième tableau croisé dynamique. . Si vous utilisez une relation hasMany, elle peut être seulement associée à une relation belongsTo et aucune table de base de données supplémentaire n'est requise.

Dans votre exemple, il vous suffit de transformer la relation inverse en un belongsToMany et d'ajouter à nouveau votre tableau personnalisé, ainsi que les clés étrangères et locales (en inversant l'ordre de l'autre modèle).

124
Andy Noelker

Essayez de comprendre avec du texte et une figure.

  1. Relation un à un (hasOne):

    • Un utilisateur a (peut avoir) un profil. Ainsi, un profil appartient à un utilisateur.
  2. Un à plusieurs (beaucoup):

    • Un utilisateur a beaucoup (peut avoir beaucoup) d'articles. Ainsi, de nombreux articles appartiennent à un utilisateur.
  3. Beaucoup à beaucoup (BelongsToMany):

    • Un utilisateur peut appartenir à de nombreux forums. Ainsi, un forum appartient à de nombreux utilisateurs.

    RelationShip

27
Kabir Hossain