Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Bom dia,
Eu estou avançando no cake, mas sinto que ainda faltam várias coisas para aprender e uma delas é a utilização de joins.
Eu tenho duas tabelas que preciso fazer join para exibir em uma listagem, uma é a Usuarios e a outra Usuariotipos.
Estou seguindo a dica que encontrei de um participante do fórum que encontrei no seguinte link:
Então, meu contrller para Usuarios hoje esta assim:
<?php
class UsuariosController extends AppController {
var $name = 'Usuarios';
var $helpers = array( 'Html' , 'Form' , 'Javascript' , 'Ajax' );
function index(){
$Usuarios = $this->Usuario->find( 'all', array( 'joins' => array(
'table' => 'usuariotipos',
'alias' => 'UT',
'type' => 'INNER',
'conditions' => array('UT.id = Usuario.usuariotipo_id' ))));
$this->set('Usuarios' , $Usuarios );
}
}
?>
O problema é que ele não esta gerando a query de forma correta e o seguinte erro é exibido:
>
Warning (512): SQL Error: 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'usuariotipos UT INNER Array WHERE 1 = 1' at line 1 [CORE\cake\libs\model\datasources\dbo_source.php, line 525]
Query: SELECT `Usuario`.`id`, `Usuario`.`ativo_id`, `Usuario`.`atualizacao_id`, `Usuario`.`cadastro_id`, `Usuario`.`cancelado_id`, `Usuario`.`ds_mail`, `Usuario`.`ds_nome`, `Usuario`.`ds_senha`, `Usuario`.`dt_nascimento`, `Usuario`.`ts_atualizacao`, `Usuario`.`ts_cadastro`, `Usuario`.`ts_inclusao`, `Usuario`.`usuariotipo_id` FROM `usuarios` AS `Usuario` usuariotipos UT INNER Array WHERE 1 = 1
Se reparar, o INNER JOIN parece não estar sendo criado, no final da query ele esta fazendo isso:
>
FROM usuarios AS Usuario usuariotipos UT INNER Array WHERE 1 = 1
Alguém poderia me dizer se falta alguma coisa ali no meu código?
Obrigado!
eu sempre uso as relações que o cake já traz. No model só coloco o tipo de relacionamento ex:
Perfis tem vários Usuários;
Usuários pertence a um Perfil
no model eu faço assim
//Perfil AppModel
var $hasMany = array('Usuario');
//Usuario AppModel
var $belongsTo = array('Perfil');
Acho que foi isso que entendi sobre JOINS, ainda mais sobre seu problema, qualquer duvida
http://book.cakephp.org/pt/view/78/Associations-Linking-Models-Together
Taffarelo3, isso é porque as vezes podemos querer forçar os joins ou utilizar uma unica vez, aí podemos utilizar o modo que você falou, o zenfra e também a o método bindModel.
Me veio uma idéia mas não sei como implementar...
Na estrutura de declaração do relacionamento existe o $options['conditions'], não seria o caso de setar
essa condição lá... e bastará declarar a função de busca... que ja seria automatizado essa query?
var $belongsTo = array(
'Exemplo' => array(
'className' => 'exemplo',
'foreignKey' => 'exemplo_id',
'conditions' => ' ?????? '
}
Alguém já utilizou essa propriedade 'conditions' na declaração do relacionamento?
Minha idéia seria utilizar em um sisteminha que fiz:
Tabela: Estado
* id
nome
Tabela: Cidade
* id
nome
* estado_id (lista todos estados)
Tabela: Cadastro
* id
* estado_id ( Criar uma condição que verifica se o estado_id é encontrado na tabela Cidade.estado_id )
* cidade_id (lista todas cidade)
Geralmente o conditions do model server para toda vez que fizer um find, resgatar dados com uma determinado condição (sem ser JOIN por exemplo), como:
'conditions' => array('ativo' => true);
O que você quer aí não poderia ser resolvido assim?
var $belongsTo = array('Estado' , 'Cidade');
Bom, o relacionamento do meu banco de dados está desta maneira...
;-)
No CADASTRO montei um select com os ESTADOS que possuem alguma
cidade pertencente a ele.
Ex.:
<ESTADOS>
MG
SP
<CIDADES> <ESTADOS_ID>
BELO HORIZONTE MG
Neste caso o select só apareceria o ESTADO MG pois possui pelo menosuma cidade cadastrada.
O sisteminha já esta funcionando... mas pensei que poderia utilizar
LEFT JOINS neste 'conditions' do relacionamento, o que me ajudaria e
muito em não ter que ficar fazendo a verificação com uma função extra.
Ja tentou buscar os dados "de um lado" diferente?
Exemplo:
$this->Estado->find('all');ou
$this->Cidade->find('all');
Um deles deverá vir com LEFT JOIN. (acho q o model com belongsTO)E se você utilizar o type LEFT na declaração o joins?
Como eu fiz lá em cima, mas no meu caso estou utilizando INNER
Funciona também!
Lucas, eu já havia pensando em utilizar os dados que vem com o recursive...
o problema é que eles irão repetir caso eu tenha 2 CIDADES do mesmo ESTADO.
Zenfra, acabei que tive que usar é INNER mesmo... pois eu tenho que ter o estado
cadastrado na tabela CIDADE. ;-)
Ficou assim o código:
$estados = $this->Cadastro->Estado->find('list', array(
'joins' => array(
array(
'table' => 'cad_cidades',
'alias' => 'cidades',
'type' => 'INNER',
'conditions' => array('cidades.estado_id = Estado.id')))));
[http://forum.imasters.com.br/public/style_emoticons/](http://forum.imasters.com.br/public/style_emoticons/)default/clap.gif
Bom,
Solucionado, faltava um array na declaração do joins.
Sendo que antes estava assim:
E agora assim:Mesmo assim obrigado...
Mas se alguém souber outras formas... agradeço