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 Role
s, et un Role
donné aurait plusieurs Comment
s, 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 hasMany
Comments
, 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?
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).
Essayez de comprendre avec du texte et une figure.
Relation un à un (hasOne):
Un à plusieurs (beaucoup):
Beaucoup à beaucoup (BelongsToMany):