Behavior Super Find veio ao mundo

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:

?View Code PHP1
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.