Как ограничить количество ассоциаций для каждой записи / группы?
У меня есть модель, статьи, в которой есть много тезисов. Я хочу загрузить 10 последних статей и для каждой статьи реферат с наибольшим количеством баллов. Моя функция выглядит так:
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 );
}
Результат, который я получаю, не тот, который я намереваюсь. Просматривая SQL, в первую очередь CakePHP получает файл article.id со всем в категории (отлично). Затем CakePHP входит в таблицу Abstracts, используя эти 10 article.id, которые он только что нашел, и запрашивает 10 Abstracts с наибольшим количеством голосов (принадлежащих этим статьям).
Проблема в том, что я хочу 1 реферат для каждой статьи, а не 10 тезисов, принадлежащих какой-либо статье в этой категории. Как я могу это исправить? Благодарность
РЕДАКТИРОВАТ
ndm предположил, что это дубликат Использование лимита () для содержащейся модели поэтому я попытался найти там решение. А именно, я добавил это в свою модель:
$this->hasOne('TopAbstract', [
'className' => 'Abstracts',
'foreignKey' => 'abstract_id',
'strategy' => 'select',
'sort' => ['TopAbstract.points' => 'DESC'],
'conditions' => function ($e, $query) {
$query->limit(1);
return $e;
} ]);
А потом я пытаюсь найти статьи по категориям, содержащие (['TopAbstract']), только это убивает мой SQL. Умирает ужасной смертью:
Error: SQLSTATE[HY000]: General error: 1 near ")": syntax error
Debug даже не показывает запрос, который его убил, поэтому я не уверен, как его отладить?
РЕДАКТИРОВАТ
Говорю немного, но ошибка определенно в части «условий» hasOne. Я вытащил это, и это прекрасно работает. Не могу найти пример того, как это должно выглядеть на веб-сайтах ... у кого-нибудь есть идеи?