Depois de ter criado o post sobre o Behavior para melhorar o find, cá está ele! Ontem a noite criei o projeto e enviei o código que tenho para o GitHub, no projeto entitulado de super_find.
Tinha dito que o nome seria power find, mas depois de ver alguns projetos na internet como o SuperAuth, SuperValidatable, etc., resolvi manter o nome de SuperFind.
Bem, vamos ao que interessa, o que faz e como funciona… Basicamente, ele serve para fazer um find podendo colocar condições de relacionamentos hasMany e HABTM. No CakePHP puro isto não é possível, pois ele joga estas condições na query direto e acaba causando um erro de SQL. Aí você dizer, mas e o Containable?! Bem, ele até faz alguns filtros, mas o filtro que ele faz é em cima do valor retornado da consulta principal. Vamos a um exemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | $this->Usuario->find('all', array('contain' => array('Tarefa.nome = "Tarefa 1"))); /* Retorno: array( array( 'Usuario' => array('id' => 1, 'nome' => 'Usuario 1'), 'Tarefa' => array( array('id' => 1, 'nome' => 'Task 1', 'usuario_id' => 1) ) ), array( 'Usuario' => array('id' => 2, 'nome' => 'Usuario 2'), 'Tarefa' => array( ) ), array( 'Usuario' => array('id' => 3, 'nome' => 'Usuario 3'), 'Tarefa' => array( ) ), ) */ $this->Usuario->superFind('all', array('conditions' => array('Tarefa.nome' => 'Tarefa 1'))); /* Retorna: array( array( 'Usuario' => array('id' => 1, 'nome' => 'Usuario 1'), 'Tarefa' => array( array('id' => 1, 'nome' => 'Tarefa 1', 'usuario_id' => 1) ) ) ) */ |
Em resumo, no Containable ele listou todos os usuários e no relacionamento Tarefa veio apenas os que tinham a ‘Tarefa 1′. Já no SuperFind ele mostrou apenas os usuários que tinham a ‘Tarefa 1′.
O mesmo funciona com relacionamentos HABTM. Para os relacionamentos hasOne e belongsTo não são necessários, pois isto já funciona nativamente.
Por enquanto é possível fazer isto apenas com um nível de filtro, ou seja, você não poderá colocar nas condições algo como Tarefa.Projeto.nome.
Bem, por enquanto é isso. Alguém tem mais sugestões do que poderia entrar? O que sente falta no find?
Abraços e bom uso.