4
respostas

Dúvida de query com Join no Cake PHP

Oi pessoal, sou nova no desenvolvimento em CakePHP e estou com dificuldade para criar um Join entre tabelas.

O que eu quero é muito simples... Quero listar todos os nomes de usuários (tabela: usuario) que possuem acesso ao sistema (tabela: permissao), porém, existem 3 condições que devem ser atendidas (são campos da tabela permissão: id_sistema= '1', ativo= 'S' e tipo_usuario in (0,1,2)) em resumo quero a seguinte query:

select u.nome_usuario
        from usuario as u inner join permissao as p on (u.id_usuario = p.id_usuario) 
        where p.id_sistema = 1 
            and p.ativo = 'S' 
            and p.tipo_usuario in (0,1,2)

Fiz o seguinte em meu código Cake:

// PRIMEIRO NO DIRETÓRIO Model\Table--------------------------------- // ARQUIVO: UsuariosTable.php

<?php 
namespace App\Model\Table;
use Cake\ORM\Table;
class UsuariosTable extends Table {
    public function initialize()
    {
        $this->belongsTo('Permissao'); //associo as tabelas
    }
 ?>

// ARQUIVO: PermissoessTable.php

<?php 
namespace App\Model\Table;
use Cake\ORM\Table;
class PermissaoTable extends Table {

     public function initialize()
    {
        $this->belongsTo('Usuario')->setForeignKey('id_usuario'); //associo as tabelas
    }        
 ?>

//NO CONTROLLER DIRETÓRIO: Controller--------------------------------- //ARQUIVO: UsuariosController.php

<?php 
namespace App\Controller;
use Cake\ORM\TableRegistry;
use Cake\View;
class UsuariosController extends AppController {
    public function index(){
$usuarioTable = TableRegistry::get('usuario');
        $usuarios = $usuarioTable->find()->contain('permissao')->where([
            'permissao.id_sistema' => 'A'])->order([
            'nome_usuario' => 'ASC']
        );
        $this->set('usuarios',$usuarios);
    }
}
 ?>

//obs: só coloquei a primeira condição pra iniciar o teste e ver se funciona o join, e já quebrou a página!

Criei a chame primária na tabela usuário (id_usuario) e na tabela permissao ela esta como chave estrangeira!

// Como está no diretório Template\Usuarios\ Arquivo: index.ctp:

<div class="container">

<table class="table table-striped">
    <thead>
        <tr>
            <th>Usuário</th>
        </tr>
    </thead>
</table>

  <table class="table table-bordered">

    <tr>
    <?php
        foreach($usuarios as $usuario){
    ?>

    <tr>
            <?= $usuario['nome_usuario']; ?><br>
    </tr>
    <?php } ?>
    </tr>
    </table>
</div>

E estou tomando o seguinte erro na tela:

Error

An Internal Error Has Occurred

Sei que o problema está na query com join pois executo um select sem join na tabela usuario e funciona! Alguém poderia me ajudar? Já procurei no Cake Book... tentei outras formas a partir dele porém nda funciona! :-(

4 respostas

Oi Priscila, tudo bom?

Realmente a sintaxe para esse tipo de relacionamento no Cake pode ser meio chata, pois eles usam um ORM próprio.

Tentei escrever sua query:

select u.nome_usuario
        from usuario as u inner join permissao as p on (u.id_usuario = p.id_usuario) 
        where p.id_sistema = 1 
            and p.ativo = 'S' 
            and p.tipo_usuario in (0,1,2)

com base em algumas querys com join que eu vi na documentação, como estou sem seu ambiente para testar, tenta rodar ela e qualquer coisa você me fala tudo bem?

$usuarioTable->find('all', array(
        'joins' => array(
            array(
                'table' => 'permissao',
                'alias' => 'uPermissao',
                'type' => 'INNER',
                'conditions' => array(
                    'uPermissao in (usuario.id_usuario = uPermissao.id_usuario)',
                    'uPermissao.id_sistema' => 'A'
                    'uPermissao.tipo_usuario in (0,1,2)
                )
            )
        ),
        'fields' => array('usuario.nome_usuario')
    ));

Abraço e bons estudos =)

André Chaves, obrigada pelo retorno! Fiz algumas alterações no código, implementei... parou de estourar o erro na tela... porém não está respeitando as condições... vou continuar na tentativa aqui, uma hora tem q funcionar!

Se alguém tiver uma ideia de como fazer, please, pode contribuir... tda ajuda é bem vinda! rsrsrs :-)

O que aconteceu dessa vez? Qual foi o retorno?

Não estourou erro... mas tb não trouxe nenhum registro!