Qual é a melhor maneira de criar um relacionamento tableA HABTM tableA para uma aplicação CakePHP?
-
03-07-2019 - |
Pergunta
Eu tenho a necessidade de criar a funcionalidade para permitir que meus usuários registrados para associar-se com outros usos e criar uma família. Minhas tabelas de banco de dados parecido com este:
db.persons - (Bob, Jane, Timmy, etc)
- id
- nome
db.persons_persons
- id
- person__id_parent
- person_id_child
- relationtype_id
db.relationtypes - (cônjuge, filho, sobrinho, etc)
- id
- nome
Com essa estrutura, eu deveria ser capaz de especificar que Bob é um Esposa de Jane na tabela de persons_persons. O registro em db.persons_persons seria algo parecido com (pseudo):
ID | person_parent | person_child | relationtype
1 | Bob | Jane | Spouse
2 | Bob | Timmy | Child
Sei que isso poderia causar algum fragmentação de dados, pois se Bob e Jane são casados, então uma criança de um teria de ser associado com o outro. No entanto isso não é a minha pergunta. A minha pergunta é se ou não essa configuração de banco de dados é 'mais correto' para uso em uma aplicação CakePHP.
Solução
Em primeiro lugar, CakePHP irá automatigally flexionar uma mesa people
em um controlador people
e um modelo person
, assim você não precisa chamá-lo persons
. Então eu chamaria o relationships
tabela de pesquisa em vez de persons_persons
.
Eu chamaria os campos em sua person_id
tabela de relacionamentos, relation_id
e relation_type_id
, e depois adicionar um sublinhado no seu nome de tabela relationtypes
por isso se torna relation_types
.
Eu acho que isso é mais semântica.
Você ainda pode usar uma associação hasAndBelongsToMany, e fazer uso da automagic " com " associações oferecidos pelo CakePHP (1.2 apenas) para aceder aos dados adicionais na tabela HABTM para o tipo de relação.
No entanto, eu estaria tentado a usar:
-
Person
hasManyRelation
-
Relation
Person
belongsTo,Relation
,RelationType
Em seu aplicativo, é uma relação de pessoas implícitos por alguém do relacionamento com eles? Ou seja, se você encontrar Person.id = 1 que você pode obter todas as suas relações, por exemplo, Person.id 2, 3 e 4. Mas se você achar Person.id 2, você não iria automaticamente get Person.id = 1, a menos que houvesse um outro registro na tabela de relações que representou essa relação.
Para conseguir isso, você pode configurar outro assocation:
-
Person
hasManyRelation1
com foreignKeyperson_id
-
Person
hasManyRelation2
com foreignKeyrelation_id
-
Relation
Person
belongsTo,Relation
,RelationType
Nota, você pode conseguir esse duplo relacionamento com HABTM também.