我有一个模型,文章,其中有很多摘要.我想加载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 );
}
Run Code Online (Sandbox Code Playgroud)
我得到的结果不是我想要的.通过SQL,首先CakePHP获取了类别中所有内容的articles.id(很好).然后,CakePHP进入Abstracts表,使用那10篇文章.它刚刚找到,并要求获得最高票数的10篇摘要(属于那些文章).
问题是我希望每篇文章都有1篇摘要,而不是属于该类别任何文章的10篇摘要.我怎样才能解决这个问题?谢谢!
编辑
ndm建议这是对包含模型使用limit()的重复,所以我尝试了那里的解决方案.也就是说,我将此添加到我的模型中:
$this->hasOne('TopAbstract', [
'className' => 'Abstracts',
'foreignKey' => 'abstract_id',
'strategy' => 'select',
'sort' => ['TopAbstract.points' => 'DESC'],
'conditions' => function ($e, $query) {
$query->limit(1);
return $e;
} ]);
Run Code Online (Sandbox Code Playgroud)
然后我尝试使用contains(['TopAbstract'])找到Articles byCategory,只有这会杀死我的SQL.它死于可怕的死亡:
Error: SQLSTATE[HY000]: General error: 1 …Run Code Online (Sandbox Code Playgroud)