¿Cuál es la mejor manera de crear una tabla HABTM tabla Una relación para una aplicación CakePHP?
-
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.
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
hasManyRelation
-
Relation
belongsToPerson
,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
hasManyRelation1
con foreignKeyperson_id
-
Person
hasManyRelation2
con foreignKeyrelation_id
-
Relation
belongsToPerson
,Relation
,RelationType
Tenga en cuenta que también puede lograr esta relación dual con HABTM.