Pages

Subscribe:

Ads 468x60px

Labels

10/02/2014

TRABALHANDO COM O CAKEPHP E O USO DE JOIN


Entre os framaworks de desenvolvimento ágil e rápido de aplicações em linguagem PHP, temos o CakePHP.  Criado e mantido pelo desenvolvedor  Garrett Woodworth (aproximadamente em 2009).  Possui uma excelente estrutura contendo todos os padrões de separação de camadas do MVC e boas práticas de programação.  Sua documentação e colaboração em sua comunidade tem animado mais e mais a multiplicar seus novos adeptos a este framework.

Vou tratar de deixar registrado um recurso para quem já iniciou seus projetos com o CakePHP ou pretende iniciar, que trata sobre o uso de JOINS numa consulta que retorna uma paginação de resultados vindo de 2 ou mais tabelas de um banco relacional MySQL.
Observe que neste exemplo temos na linha 43 a parametrização do recursive como -1, para que o JOIN desta consulta ocorra desprezando os relacionamentos existentes no Model da aplicação para este contexto de visão no Controller.  

A linha 44 além de trazer o relacionamento dos campos da tabela de Log e Users(usuários) ele armazena em uma sub-consulta a data de último acesso ao sistema através da leitura do registro de ultimo acesso:
$this->paginate['User']['fields'] = array('Log.*,(SELECT MAX(created) FROM logs WHERE users = User.id ORDER BY created DESC LIMIT 1) as ultimo','User.*');

Nas linhas 46 a 53 temos a consulta JOIN de relacionamento da tabela users com a tabela logs através de suas respectivas chaves primária e estrangeiras.

Na linha 54 temos uma conditions (condição) para caso o filtro de busca seja usado será filtrado e adequadamente listado.

Linha 55 temos o agrupamento da tabela ou GROUP BY, seguido pelo ORDER (ordenação linha 56) e limite de páginas a serem exibidas na listagem (linha 57).

A estrutura da classe do modelo de Log ficou simples e objetiva para este caso:
-------------------------------------------------------------------------------------------------------
class Log extends AppModel {
    
    public $name = 'Log';

public $belongsTo = array(
        'User' => array(
            'className'=> 'User', 
            'foreignKey' => 'users'
)
      );
}
-------------------------------------------------------------------------------------------------------

Já a classe de modelo (Model) de usuário foi mantido acrescentado ao atributo $belongsTo o relacionamento do Model Logs:
-------------------------------------------------------------------------------------------------------
public $belongsTo = array(
'Group' => array(
'className' => 'Group',
'foreignKey' => 'group_id',
'conditions' => '',
'fields' => '',
'order' => ''
),
'Log' => array(
'className' => 'Log',
'foreignKey' => 'id'
)
);
------------------------------------------------------------------------------------------------------- 

Disso resultará uma consulta para listar todos os usuários ativos e suas respectivas data e hora de último acesso:


Podemos ver na coluna Ultimo - Acesso a data e hora de último acesso de cada usuário ao sistema.

Achei bom compartilhar esta experiência e agradeço a colaboração e ajuda de meu amigo Victor Souto que me orientou a melhor prática para chegar a esse resultado.

Um abraço a todos (as).
Bibliografia:
http://pt.wikipedia.org/wiki/CakePHP
http://www.mainelydesign.com/blog/view/forcing-a-single-join-in-cakephp-pagination
http://book.cakephp.org/2.0/en/core-libraries/components/pagination.html



0 comentários:

Postar um comentário

Todos os comentários serão moderados e postados um tempo depois, comentários ofencivos serão deletados.