hasMany vs pertenece a muchos en laravel 5.x

4 minutos de lectura

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 Roles, y un dado Role tendría muchos Comments, 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 Commentspero 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?

avatar de usuario
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

avatar de usuario
Kabir Hossain

Trate de entender con texto y una figura.

  1. Relación uno a uno (hasOne):

    • Un usuario tiene (puede tener) un perfil. Entonces, un perfil pertenece a un usuario.
  2. Uno a muchos (hasMany):

    • Un usuario tiene muchos (puede tener muchos) artículos. Entonces, muchos artículos pertenecen a un usuario.
  3. Muchos a muchos (pertenece a muchos):

    • Un Usuario puede pertenecer a muchos foros. Entonces, un foro pertenece a muchos usuarios.

    Relación

  • 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


¿Ha sido útil esta solución?