Como limitar associações contidas por registro / grupo?
Tenho um modelo, artigos, que tem muitos resumos. Quero carregar os 10 artigos mais recentes e, para cada artigo, o Resumo com o maior número de pontos. Minha função é assim:
public function getArticles($category, $viewName) {
$subArticles = $this->Articles->findByCategory($category)->contain([
'Abstracts' => function ($q) {
return $q
->select(['body', 'points', 'article_id'])
->where(['Abstracts.approved' => true])
->limit(10)
->order(['Abstracts.points' => 'DESC']);
}
])
->limit(10)
->order(['Articles.created' => 'DESC']) ;
$this->set( $viewName . 'Articles', $subArticles );
}
O resultado que recebo não é o que pretendo. Olhando através do SQL, o primeiro CakePHP está obtendo o articles.id de tudo na categoria (ótimo). Então, o CakePHP entra na tabela Abstracts, usando os 10 articles.id que acabou de encontrar, e solicita os 10 Abstracts com os votos mais altos (que pertencem a esses artigos
O problema é que eu quero 1 resumo para cada artigo, não os 10 resumos pertencentes a qualquer artigo nessa categoria. Como posso consertar isso? Obrigado
EDITA
ndm sugeriu que esta era uma duplicata deUsando limit () no modelo contido então tentei a solução lá. Adicionei isto ao meu modelo:
$this->hasOne('TopAbstract', [
'className' => 'Abstracts',
'foreignKey' => 'abstract_id',
'strategy' => 'select',
'sort' => ['TopAbstract.points' => 'DESC'],
'conditions' => function ($e, $query) {
$query->limit(1);
return $e;
} ]);
E então eu tento encontrar os artigos por categoria, com contains (['TopAbstract']), apenas isso mata meu SQL. Ele morre horrivelmente:
Error: SQLSTATE[HY000]: General error: 1 near ")": syntax error
Debug nem mostra a consulta que a matou, então não sei como depurar est
EDITA
Fale comigo um pouco, mas o erro está definitivamente na parte 'condições' do hasOne. Eu tiro isso e funciona bem. Não consegue encontrar um exemplo de como isso deve parecer nas interwebs ... alguém tem alguma idéia?