Tengo curiosidad por qué la relación Eloquent para hasMany
tiene una firma diferente a la de belongsToMany
. Específicamente, el nombre de la tabla de combinación personalizada, para un sistema en el que un determinado Comment
pertenece a muchos Role
s, y un dado Role
tendría muchos Comment
s, quiero almacenar la relación en una tabla llamada my_custom_join_table
y tener las llaves configuradas como comment_key
y role_key
.
return $this->belongsToMany('App\Role', 'my_custom_join_table', 'comment_key', 'role_key'); // works
Pero por el contrario, no puedo definir esa tabla personalizada (al menos los documentos no lo mencionan):
return $this->hasMany('App\Comment', 'comment_key', 'role_key');
si tengo un Role
objetar que hasMany
Comments
pero uso un nombre de tabla no estándar para almacenar esa relación, ¿por qué puedo usar esta tabla no estándar en un sentido pero no en el otro?
Andy Noelker
hasMany
se usa en un Uno a muchos relación mientras belongsToMany
se refiere a un Muchos a muchos relación. Ambos son tipos de relación distintos y cada uno requiere una estructura de base de datos diferente, por lo que toman diferentes parámetros.
La diferencia clave es que en una relación de uno a varios, solo necesita las dos tablas de la base de datos que corresponden a los modelos relacionados. Esto se debe a que la referencia a la relación es almacenado en la propia tabla del modelo propio. Por ejemplo, es posible que tenga un Country
modelo y un City
modelo. Un país tiene muchas ciudades. Sin embargo, cada ciudad solo existe en un país. Por lo tanto, almacenaría ese país en el propio modelo City (como country_id
o algo así).
Sin embargo, una relación Muchos a Muchos requiere una tercera tabla de base de datos, llamada tabla dinámica. La tabla dinámica almacena referencias a ambos modelos y puede declararla como un segundo parámetro en la declaración de relación. Por ejemplo, imagina que tienes tu City
modelo y también tienes un Car
modelo. Desea una relación para mostrar los tipos de automóviles que conducen las personas en cada ciudad. Bueno, en una ciudad la gente conducirá muchos diferentes tipos de coche. Sin embargo, si observa un tipo de automóvil, también sabrá que se puede conducir en muchos diversas ciudades. Por lo tanto, sería imposible almacenar un city_id
o un car_id
en cualquiera de los modelos porque cada uno tendría más de uno. Por lo tanto, coloca esas referencias en la tabla dinámica.
Como regla general, si utiliza un belongsToMany
relación, puede solamente ser emparejado con otro belongsToMany
relación y significa que tiene una tercera tabla dinámica. Si usas un hasMany
relación, puede solamente ser emparejado con un belongsTo
relación y no se requieren tablas de base de datos adicionales.
En su ejemplo, solo necesita convertir la relación inversa en un belongsToMany
y agregue su tabla personalizada nuevamente, junto con las claves locales y externas (invirtiendo el orden del otro modelo).
-
Sencillo , Completo , Eficiente
– mercurio
6 de agosto de 2016 a las 22:16
-
¡Explicación muy limpia y útil!
– Andy
19 dic 2016 a las 19:39
-
explicación perfecta
– Mayank Pandeyz
5 de enero de 2017 a las 4:36
-
No diría necesariamente que un Muchos a muchos relación requiere tres tablas. La relación podría ser entre el mismo modelo, dando como resultado solo dos tablas de base de datos. Ejemplo: Amistad del usuario.
– Federico
12 de noviembre de 2017 a las 13:13
-
Bellamente explicado.
– frisbetario
18 de marzo de 2019 a las 6:30
Kabir Hossain
Trate de entender con texto y una figura.
-
Relación uno a uno (hasOne):
- Un usuario tiene (puede tener) un perfil. Entonces, un perfil pertenece a un usuario.
-
Uno a muchos (hasMany):
- Un usuario tiene muchos (puede tener muchos) artículos. Entonces, muchos artículos pertenecen a un usuario.
-
Muchos a muchos (pertenece a muchos):
- Un Usuario puede pertenecer a muchos foros. Entonces, un foro pertenece a muchos usuarios.
-
En el caso de hasOne/belongsTo, supongo que hasOne dicta qué tabla contendrá la referencia a la tabla relacionada (la tabla de usuario tiene un profile_id en este caso)?
– Lunfel
10 de julio de 2017 a las 4:00
-
También agregaría un diagrama “hasMany” y “belongsTo” que es exactamente como el primero en el diagrama. es decir, una persona puede tener muchos perros y cada perro pertenece a un dueño (información adicional, no relacionada con la pregunta)
– usuario no nulo
6 de agosto de 2020 a las 11:16
La inversa de una relación bidireccional de muchos a muchos es de muchos a muchos, no de uno a muchos. La doctrina tiene un buena presentación de todos los órdenes de relación y sus implementaciones.
– obispo
24/03/2016 a las 19:33
La documentación oficial también tiene un artículo muy agradable sobre las relaciones elocuentes. laravel.com/docs/5.2/relaciones-elocuentes
– usuario1669496
24/03/2016 a las 20:18