Qual é a melhor maneira de criar um relacionamento tableA HABTM tableA para uma aplicação CakePHP?

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

  •  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
  • e-mail

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.

Foi útil?

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 hasMany Relation
  • 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 hasMany Relation1 com foreignKey person_id
  • Person hasMany Relation2 com foreignKey relation_id
  • Relation Person belongsTo, Relation, RelationType

Nota, você pode conseguir esse duplo relacionamento com HABTM também.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top