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
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.
Postado por: Thiago Elias em 27/10/2009

