Olá Pessoal,
Seguinte tenho uma relação: Ebooks HABTM
Tags.
Desejo encontrar todos ebooks relacionadas a
uma tag X qualquer. Ou seja, procurar ebooks por tags.
Para simplificar gerei uma consulta utilizando
associação hasOne "on the fly" (baseado em Éber
Freitas). Segue o código, que está
funcionando corretamente:
____
$this->Ebook->bindModel(array('hasOne'
=> array ('EbooksTag' =>
array(
'className'
=>
'EbooksTag',
'foreignKey'
=>
'ebook_id',
'dependent'
=> true))), true);
$conditions =
'EbooksTag.tag_id IN ( 44, 45, 46 )';
$fields =
array('DISTINCT Ebook.id', 'Ebook.titulo', 'Ebook.media_votos',
'Ebook.autor_id', 'Autor.nome');
$this->data =
$this->Ebook->findAll($conditions,
$fields);
$this->set( 'ebooks' ,
$this->data);
___
O código acima gera a seguinte SQL:
| SELECT DISTINCT `Ebook`.`id`, `Ebook`.`titulo`,
`Ebook`.`media_votos`, `Ebook`.`autor_id`, `Autor`.`nome`, `Ebook`.`id` FROM
`ebooks` AS `Ebook` LEFT JOIN `autores` AS `Autor` ON (`Ebook`.`autor_id` =
`Autor`.`id`) LEFT JOIN `ebooks_tags` AS `EbooksTag` ON
(`EbooksTag`.`ebook_id` = `Ebook`.`id`) WHERE `EbooksTag`.`tag_id` IN (44, 45, 46) |
___
Acontece que desejo paginar esta consulta com
paginate();
Teoricamente funcionaria pois o método
paginate() utiliza os mesmos métodos do find(), porém não consegui de nenhuma
forma gerar a paginação.
Já fiz vários testes e não obtive resultados. Com o
paginate() o cake não está gerando LEFT JOINs.
Por exemplo ele gera a SQL:
Query: SELECT `Ebook`.`id`,
`Ebook`.`titulo`, `Ebook`.`media_votos`, `Ebook`.`autor_id`, `Autor`.`nome`
FROM `ebooks_tags` AS `EbooksTag` WHERE 1 = 1 ORDER BY
`Ebook`.`titulo` asc LIMIT 24
Para o código abaixo:
____
$this->Ebook->bindModel(array('hasOne'
=> array ('EbooksTag' =>
array(
'className'
=>
'EbooksTag',
'foreignKey'
=>
'ebook_id',
'dependent'
=> true))), true);
$conditions =
'EbooksTag.tag_id IN ( 44, 45, 46 )';
$this->paginate =
array(
'fields' => array('Ebook.id', 'Ebook.titulo',
'Ebook.media_votos', 'Ebook.autor_id',
'Autor.nome'),
'limit' =>
24,
'order'
=> array( 'Ebook.titulo' => 'asc' )
);
$this->set( 'ebooks' , $this->paginate(
$conditions ));
____
Alguém conhece uma solução?
Obrigado.
Abs,