Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

zenfra

[Resolvido] Joins

Recommended Posts

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

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

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

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

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

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

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 menos

uma 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

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.