quinta-feira, 15 de setembro de 2011

Relacionamentos CakePHP Explained


Se você desenvolveu com bancos de dados SQL no passado, provavelmente você já teve experiência com os tipos de relações diversas SQL: um-para-um, um-para-muitos e muitos-para-muitos. No CakePHP, cada tabela do banco de dados é tipicamente associada com um modelo. As relações entre os itens nestas tabelas são referidos como associações em CakePHP. CakePHP tem uma associação para cada tipo de relacionamento.
Vamos olhar para as quatro associações CakePHP, como se relacionam com a relação tradicional SQL e como trabalhar com eles em uma aplicação CakePHP. Para descrever estas associações, estaremos usando um exemplo do mundo real - uma aplicação de blog.


hasOne


A associação hasOne é como um um-para-um relacionamento é tratado dentro CakePHP. Olhando para o nosso exemplo do mundo real, cada autor tem uma biografia. Este é o relacionamento um-para-um típico. Cada bio está associado apenas com um único autor e cada autor só é associada a um bio único. Quando você configurar uma associação hasOne, o outro modelo irá conter uma chave estrangeira. No nosso exemplo, a tabela deve ter uma bio author_id campo como uma chave estrangeira. Definindo a relação em CakePHP seria algo parecido com isto:


<? Php
Autor classe estende AppModel {
  var $ name = 'Autor';
  var $ hasOne = 'Bio';
}
?>


Uma vez que esta associação é definida, uma chamada find para recuperar um autor um array com o registro de Autor como uma matriz eo registro Bio como uma matriz.


belongsTo


A associação belongsTo é um caso especial no CakePHP. Ela nos permite ligar o modelo no lado oposto de um muitos-para-um ou um-para-um. Assim, em nosso exemplo anterior, onde um autor tem um bio, um bio também pertence a um autor. Ao configurar a tabela de banco de dados, a chave estrangeira faz parte da mesa do modelo atual. Então, novamente, a tabela de bio irá incluir uma referência à author_id . A definição dessa associação em CakePHP parecido com este:


<? Php 
classe Bio AppModel estende {
  var $ name = 'Bio';
  var $ belongsTo = 'Autor';
}
?>


Isso faz com que o método para encontrar Bio para incluir o registro Autor associado também. Isto pode ser muito conveniente, agora você pode recuperar o registro relacionado de ambos os lados da relação.


hasMany


A associação hasMany é a forma como lida com CakePHP um relacionamento um-para-muitos tradicionais. Mais uma vez, no nosso exemplo, um autor pode escrever posts muitos. Isso resulta em um relacionamento um-para-muitos entre o autor eo blog dele ou dela. Em uma associação hasMany, outra tabela contém a chave estrangeira. Portanto, se um autor tem muitos posts, a tabela pós conterá uma chave estrangeira chamada author_id . A definição dessa relação em CakePHP parecido com este:


<? Php
Autor classe estende AppModel {
  var $ name = 'Autor';
  var $ hasOne = 'Bio';
  var $ hasMany = 'Post';
}
?>


Note que os modelos podem ter mais de um relacionamento. Quando um relacionamento hasMany é definido, um método para encontrar o modelo de Autor vai retornar todos os registros Mensagem associados, bem. Para mapear o outro lado dessa relação, você pode adicionar um relacionamento belongsTo no lado Post. Lembre-se que belongsTo pode ser usado para mapear a direção oposta de um um-para-muitos, assim como um relacionamento um-para-um. Meu mapeamento do outro lado, você pode acessar os dados de autor de um objeto Post. Aqui está um exemplo de como fazer isso:


<? Php
Mensagem classe estende AppModel {
  var $ name = 'Post';
  var $ belongsTo = 'Autor';
}
?>


hasAndBelongsToMany (HABTM)


A associação hasAndBelongsToMany é como CakePHP lida com um relacionamento de muitos para muitos. Por exemplo, um blog pode ter muitas tags e uma tag pode ter muitos posts. Tipicamente em SQL, usamos uma tabela de junção para gerenciar um relacionamento muitos-para-muitos. Esta tabela contém os ids de ambos os modelos relacionados, bem como, possivelmente, um ID primária para essa tabela.


A convenção do CakePHP é para a tabela de junção a ser nomeados com os nomes dos dois modelos relacionados em ordem alfabética e separados por um sublinhado. Então, para nosso exemplo, a tabela para gerenciar essa relação seria posts_tags e seria composto por três campos: id, posts_id e tags_id .


Para definir essa relação, usamos uma sintaxe de array. Parece algo como isto:


<? Php
Mensagem classe estende AppModel {
  var $ name = 'Post';
  var $ belongsTo = 'Autor';
  var $ hasAndBelongsToMany array = (
    'ClassName' => 'Tag',
    "JoinTable '=>' posts_tags ',
    "ForeignKey '=>' post_id ',
    "AssociationForeignKey '=>' tag_id '
  );
}
?>


O foreignKey nesta matriz refere-se a chave na tabela de junção que faz referência o modelo atual. O associationForeignKey indica a chave na tabela de junção que faz referência o modelo associado. Se você quiser ser capaz de acessar mensagens a partir do modelo tag, você precisa configurar uma associação hasAndBelongsToMany do modelo de Tag também.


Quando você salvar os modelos HABTM, você precisa definir o ID do modelo associado ao salvar um novo. Para o nosso modelo de post, nós definir o tag_id antes de salvar o post. Isso faria com que a associação para ser salvo. Uma ressalva importante, ao salvar uma associação HABTM, CakePHP irá apagar todas as linhas relacionadas da tabela de junção antes de salvar. Portanto, se um post 10 tags e agora você salvá-lo com 2, o posto passará a conter 2 tags, não 12 como você poderia esperar.


There is a work around for this behavior. You can think of a HABTM association as a third model. Each of the related models has a hasMany and belongsTo association with this third model. You can define this third model and create the hasMany and belongsTo associations between it and your other 2 models. In fact, if your join table contains additional fields, this is the simplest way to handle a HABTM relationship.


We’ve quickly gone over the basic associations between models in CakePHP and looked at how they relate to the traditional SQL relationships of one-to-one, one-to-many, many-to-one and many-to-many. You can now use this to better understand and define the relationships between your CakePHP models.

Nenhum comentário :

Postar um comentário

Total de visualizações de página