【发布时间】:2015-07-26 08:14:40
【问题描述】:
我有一个模型,文章,它有许多摘要。我想加载 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(属于这些 Articles)。
问题是我希望每篇文章有 1 个摘要,而不是属于该类别中任何文章的 10 个摘要。我怎样才能解决这个问题?谢谢!
编辑
ndm 建议这是 Using limit() on contained model 的副本,所以我在那里尝试了解决方案。即,我将此添加到我的模型中:
$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 的“条件”部分。我把它拿出来,它工作正常。在互联网上找不到这应该如何看待的示例.. 有人知道吗?
【问题讨论】:
-
是的,在那里尝试了建议的解决方案,但无济于事。将编辑我的问题以反映进度/持续失败:-(
-
也就是说,目前这个问题没有解决办法吗?嗯.. 似乎是一个很常见的问题,我有对吗?
-
我已经删除了我之前的评论,因为我认为还有更多错误。似乎这根本不会那样工作,因为
select策略只会导致一个额外的查询,并且应用了限制,它总是只有一个结果。恐怕答案可能是,或者已经变得不正确,或者可能只是另一个错误,不确定。当不应用限制而只应用订单时,它有点工作,但订单将被颠倒,即ASC订单将选择结果,就好像它是DESC订单一样,反之亦然。 -
这很奇怪,然后可能是 SQL 编译器错误导致错误(例如,如果您返回一个空数组,它会起作用,
$e是一个“空”QueryExpression带有AND连词的实例),您可能想要report this over at GitHub。
标签: cakephp orm associations cakephp-3.0 query-builder