thiagoelias.org

Your technology website

 

Forçando Joins no CakePHP

Todos sabemos que o cakePHP é um excelente framework para PHP, trazendo grandes benefícios no desenvolvimento, no entanto, como em todos os recursos em que utilizamos, sempre há algo que precisamos desenvolver que não é possível utilizar apenas as consultas padrões.

Uma das dificuldades que tenho notado em todos que estão começando a desenvolver no cake, é fazer com que determinada consulta obtida recursivamente, seja feita através de um INNER JOIN, reduzindo a quantidade de consultas que o framework produz para chegar ao resultado (sendo que algumas vezes nem mesmo é possível chegar ao resultado esperado apenas com o recursive).

 

Há duas formas interessantes de se realizar esta tarefa.

 

Uma delas é realizar um unbind model e posteriormente, um bind model para refazer o relacionamento "on the fly", mas esta abordarei em outro artigo.

A outra, é forçar a JOIN dentro de uma consulta FIND.

Vamos levar em consideração a seguinte situação.

 

  • pessoas
    • id
    • nm_pessoa
    • nm_email
  • posts
    • id
    • ds_post
    • nm_titulo
    • pessoa_id

O relacionamento das tabelas supra citadas é o seguinte:

Pessoa hasMany Post
Post belongsTo Pessoa

Evidentemente, este relacionamento é bem simples, sendo que a JOIN neste caso é feita automaticamente pelo cake, no entanto, nosso intuito neste artigo é apenas mostrar como realizar JOINS (como fazíamos utilizando SQL's convencionais) no cakePHP, sem recorrer ao método query para construir a consulta manualmente.


Suponhamos que em nosso PessoasController, temos um método chamado listar. Nosso objetivo é exibir todas os posts de uma determinada pessoa, forçando a join:


Abaixo, o código para obter o resultado sem forçar a join:

 

class PessoasController extends AppController{
    
    function listar(){
        $posts = $this->Pessoa->find("all");
    }

}

Agora, o código forçando a join:

class PessoasController extends AppController{
    
    function listar(){
        $posts = $this->Pessoa->find("all",array(
                "joins" => array(
                    array(
                        "table" => "posts",
                        "alias" => "Post",
                        "type" => "INNER",
                        "conditions" => array("Pessoa.id = Post.pessoa_id")
                    )
                )
            )
        );
    }

}

 

Onde:

 

  • table: Nome da tabela que deseja associar
  • alias: Apelido da tabela (Em nosso caso, Post)
  • type: Tipo de associação (INNER, LEFT, RIGHT, etc),
  • conditions: Array contendo as condições para juntar a tabela, como fazemos na cláusula ON de uma SQL, associando a Primary Key de uma tabela à foreign Key da outra.

Para fazer diversas associações, basta ir adicionando mais arrays dentro do array "joins".

Feito isso, você poderá associar suas tabelas da forma que for necessário, mas sempre lembrando que o ideal é realmente seguir as convenções do cakePHP, deixando seu código mais limpo. Esse tipo de solução é mais utilizado quando realmente temos associações complexas, onde não há a possibilidade de obter os registros somente com a recursão, ou quando é necessário maior desempenho, uma vez que quanto maior o nivel de recursão das consultas, pior será o tempo de resposta.

Em breve, abordarei como efetuar o mesmo procedimento, utilizando o bindModel e unbindModel, que também é um grande aliado na hora de obter os mais complexos níveis de associações entre suas tabelas.

 



Postado por: Thiago Elias em 27/10/2009

| Mais



Voltar

Comentar este artigo





Comentários: (0)

Não há comentários para esta matéria.