¿Cómo limitar las asociaciones contenidas por registro / grupo?
Tengo un modelo, artículos, que tiene muchos resúmenes. Quiero cargar los 10 últimos artículos, y para cada artículo, el resumen con el mayor número de puntos. Mi función se ve así:
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 );
}
El resultado que obtengo no es lo que pretendo. Mirando a través del SQL, primero CakePHP está obteniendo los artículos.id de todo en la categoría (bien). Luego, CakePHP entra en la tabla de Resúmenes, usando esos 10 artículos. ID que acaba de encontrar, y solicita los 10 Resúmenes con los votos más altos (que pertenecen a esos Artículos).
El problema es que quiero 1 resumen para cada artículo, no los 10 resúmenes que pertenecen a cualquier artículo en esa categoría. ¿Cómo puedo arreglar esto? ¡Gracias
EDITA
ndm sugirió que esto era un duplicado deUtilizando límite () en el modelo contenido así que intenté la solución allí. A saber, agregué esto a mi modelo:
$this->hasOne('TopAbstract', [
'className' => 'Abstracts',
'foreignKey' => 'abstract_id',
'strategy' => 'select',
'sort' => ['TopAbstract.points' => 'DESC'],
'conditions' => function ($e, $query) {
$query->limit(1);
return $e;
} ]);
Y luego trato de encontrar los artículos por categoría, con contener (['TopAbstract']), solo esto mata mi SQL. Muere una muerte horrible:
Error: SQLSTATE[HY000]: General error: 1 near ")": syntax error
Debug ni siquiera muestra la consulta que la mató, ¿así que no estoy seguro de cómo depurar esta?
EDITA
Hablando un poco conmigo mismo, pero el error definitivamente está en la parte de 'condiciones' de hasOne. Lo saco y funciona bien. No puedo encontrar un ejemplo de cómo se supone que debe verse esto en las redes. ¿Alguien tiene alguna idea?