thiagoelias.org

Your technology website

 

Desfazer associações em tempo de execução no cakePHP

Por muitas vezes, ao programar utilizando o cakePHP, nos deparamos com a situação de precisarmos de determinado campo que está em uma tabela associada, no entanto, em nosso model temos mais um ou dois relacionamentos no mesmo nível de recursão.

 

Vamos adotar a seguinte situação:

 

Nosso model em quesão chama-se Cidade

 

Cidade belongsTo Estado
Cidade belongsTo Pais

 

No exemplo acima, podemo ver que existem dois relacionamentos do mesmo nível, ou seja, quando fizermos uma consulta com o método find ou mesmo paginate, certamente teremos duas joins, retornando os resultados referentes às duas associações, mas suponhamos que apenas queremos o nome do Estado em que nossa cidade situa-se.

Para atingir o objetivo especificado, será necessário desfazer o relacionamento que foi definido no Model, e a ferramenta que podemos utilizar para tal tarefa é o unbindModel.

O que o unbindModel faz, é desfazer uma associação em tempo de execução, fazendo com que você possa requisitar apenas os dados referentes à tabela que deseja, desta forma dispensando a associação desnecessária com a tabela País, e evidentemente, melhorando a performance.

Abaixo, o exemplo de como desfazemos a associação com o unbindModel:

 

$this->Cidade->unBindModel(array('Pais'));

 

Feito isso, a associação já não mais existirá para a próxima consulta, sendo assim, podemos realizar o find normalmente, que a associação com País já não mais existe:

 

$cidade = $this->Cidade->find('all');

 

Desta forma, todas as cidades cadastradas no banco, serão exibidas, trazendo apenas os respectivos dados das tabelas Cidade e Estado.

Aí você me pergunta: E agora, minha associação com Pais está perdida ?

A resposta é NÃO. Tanto o unBindModel quanto o bindModel, removem a associação apenas para a próxima consulta que for realizada. Quando esta terminar, todas as associações são restauradas, sendo então necessário outro unbindModel, caso queira realizar o mesmo procedimento novamente.

Há também, formas de criar associações que não foram descritas na especificação do model, utilizando o bindModel, mas esta dica abordarei em outro artigo.

Em resumo, o unbindModel é o recurso ideal que todo desenvolvedor cake precisa quando há a necessidade de remover associações não desejadas em determinados momentos do código, sendo possível melhorar a performance das consultas realizadas pelo framework.



Postado por: Thiago Elias em 17/11/2009

| Mais



Voltar

Comentar este artigo





Comentários: (1)

João José diz:
Olá Thiago,

Um ótimo recurso para fazer "binds e unbinds" de Modelos é o ContainableBehavior. Muitos não conseguem perceber mas o que realmente o Containable faz é uma série de "unbinds" multi-nível para pegar de forma efetiva os dados do Banco.

Abraços!