zenfra 0 Denunciar post Postado Novembro 21, 2009 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: Joins no cakePHP 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! Compartilhar este post Link para o post Compartilhar em outros sites
zenfra 0 Denunciar post Postado Novembro 21, 2009 Bom, Solucionado, faltava um array na declaração do joins. Sendo que antes estava assim: $Usuarios = $this->Usuario->find( 'all', array( 'joins' => array( 'table' => 'usuariotipos', 'alias' => 'UT', 'type' => 'INNER', 'conditions' => array('UT.id = Usuario.usuariotipo_id' )))); E agora assim: $Usuarios = $this->Usuario->find( 'all', array( 'joins' => array( array( 'table' => 'usuariotipos', 'alias' => 'UT', 'type' => 'INNER', 'conditions' => array('UT.id = Usuario.usuariotipo_id' ))))); Mesmo assim obrigado... Mas se alguém souber outras formas... agradeço Compartilhar este post Link para o post Compartilhar em outros sites
Taffarelo3 0 Denunciar post Postado Novembro 22, 2009 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 Compartilhar este post Link para o post Compartilhar em outros sites
lucaswxp 22 Denunciar post Postado Novembro 22, 2009 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. Compartilhar este post Link para o post Compartilhar em outros sites
Sérgio Macedo 0 Denunciar post Postado Novembro 22, 2009 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) Compartilhar este post Link para o post Compartilhar em outros sites
lucaswxp 22 Denunciar post Postado Novembro 22, 2009 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'); Compartilhar este post Link para o post Compartilhar em outros sites
Sérgio Macedo 0 Denunciar post Postado Novembro 23, 2009 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. Compartilhar este post Link para o post Compartilhar em outros sites
lucaswxp 22 Denunciar post Postado Novembro 23, 2009 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) Compartilhar este post Link para o post Compartilhar em outros sites
zenfra 0 Denunciar post Postado Novembro 23, 2009 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! Compartilhar este post Link para o post Compartilhar em outros sites
Sérgio Macedo 0 Denunciar post Postado Novembro 23, 2009 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/default/clap.gif Compartilhar este post Link para o post Compartilhar em outros sites