¿Cuál es la mejor manera de crear una tabla HABTM tabla Una relación para una aplicación CakePHP?

StackOverflow https://stackoverflow.com/questions/226805

  •  03-07-2019
  •  | 
  •  

Pregunta

Tengo la necesidad de crear la funcionalidad para permitir que mis usuarios registrados se asocien con otros usos y creen una familia. Las tablas de mi base de datos se parecen a esto:

db.persons - (Bob, Jane, Timmy, etc.)

  • id
  • nombre
  • correo electrónico

db.persons_persons

  • id
  • person__id_parent
  • person_id_child
  • relationtype_id

db.relationtypes - (cónyuge, hijo, sobrino, etc.)

  • id
  • nombre

Con esta estructura, debería poder especificar que Bob es un cónyuge de Jane en la tabla persons_persons. El registro en db.persons_persons sería algo así como (psuedo):

ID | person_parent | person_child | relationtype
1  | Bob           | Jane         | Spouse
2  | Bob           | Timmy        | Child

Me doy cuenta de que esto podría causar cierta fragmentación de los datos, ya que si Bob y Jane están casados, un hijo de uno tendría que estar asociado con el otro. Sin embargo esa no es mi pregunta. Mi pregunta es si esta configuración de la base de datos es 'más correcta' para usar en una aplicación de CakePHP.

¿Fue útil?

Solución

En primer lugar, CakePHP flexionará automáticamente una tabla people en un controlador people y un modelo person , por lo que no es necesario llamar es personas . Luego llamaría a la tabla de búsqueda relationships en lugar de persons_persons .

Llamaría a los campos en su tabla de relaciones person_id , relation_id y relation_type_id , y luego agregaría un guión bajo en su relationshiptypes nombre de la tabla para que se convierta en relation_types .

Creo que esto es más semántico.

Aún podría utilizar una asociación hasAndBelongsToMany y hacer uso de automagic " con " asociaciones ofrecidas por CakePHP (solo 1.2) para acceder a los datos adicionales en la tabla HABTM para el tipo de relación.

Sin embargo, me sentiría tentado a usar:

  • Person hasMany Relation
  • Relation belongsTo Person , Relation , RelationType

En su aplicación, ¿una relación de personas está implícita en la relación de otra persona con ellos? Es decir. Si encuentra Person.id = 1, puede obtener todas sus relaciones, por ejemplo. Person.id 2, 3 y 4. Pero si encuentra Person.id 2, no obtendrá automáticamente Person.id = 1, a menos que haya otro registro en la tabla de relaciones que represente esa relación.

Para lograr esto, puedes configurar otra asociación:

  • Person hasMany Relation1 con foreignKey person_id
  • Person hasMany Relation2 con foreignKey relation_id
  • Relation belongsTo Person , Relation , RelationType

Tenga en cuenta que también puede lograr esta relación dual con HABTM.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top