CakePHP 3 的关联限制不起作用
Posted
技术标签:
【中文标题】CakePHP 3 的关联限制不起作用【英文标题】:CakePHP 3 limit of association does not works 【发布时间】:2017-12-13 06:01:44 【问题描述】:以下是 cakephp 文档中不起作用的行。
更改获取策略
您可能已经知道,belongsTo 和 hasOne 关联是在主查找器查询中使用 JOIN 加载的。虽然这提高了查询和获取速度,并允许在检索数据时创建更具表现力的条件,但当您想要将某些子句应用于关联的查找器查询时,这可能会出现问题,例如 order() 或 limit()。
例如,如果您想获取文章的第一条评论作为关联:
$articles->hasOne('FirstComment', [
'className' => 'Comments',
'foreignKey' => 'article_id'
]);
为了正确地从该关联中获取数据,我们需要告诉查询使用选择策略,因为我们希望按特定列排序:
$query = $articles->find()->contain([
'FirstComment' => [
'strategy' => 'select',
'queryBuilder' => function ($q)
return $q->order(['FirstComment.created' =>'ASC'])->limit(1);
]
]);
谢谢
【问题讨论】:
"不起作用" 不是正确的问题描述!即使问题对于了解 CakePHP 内部结构的人来说可能很明显,请始终尽可能具体地说明确切会发生什么,以及您希望确切会发生什么而是发生。请不要只是转储 Cookbook 示例,向我们展示您的关联、您的代码、您的数据,并描述您的具体问题,即使您'正在尝试复制食谱示例 - 谢谢! 在我的情况下,一篇文章有很多 cmets,现在我需要知道如何获取每篇文章的最新评论 这就是您应该在问题中详细说明的内容。 ***.com/questions/30241975/… 我没有得到你可以根据我的需要定制谢谢 【参考方案1】:使用hasOne
时请注意,在调用queryBuilder
之后,CakePHP 将从查询中删除ORDER BY
子句。 queryBuilder
用于为JOIN
子句创建连接条件。没有 SQL 语法允许在 ON (expression)
中使用 ORDER BY
子句进行连接。
如果您想使用ORDER BY
,您还必须对hasOne
使用SELECT 策略。
您可以使用自定义查找器解决此问题。
$articles->hasOne('FirstComment', [
'className' => 'Comments',
'foreignKey' => 'article_id',
'strategy' => Association::STRATEGY_SELECT,
'finder' => 'firstComment'
]);
在您的 CommentsTable
类中定义一个设置顺序的自定义查找器。
public function findFirstComment($q)
return $q->order([$this->aliasField('created') =>'ASC']);
当自定义查找器添加时,CakePHP 不会删除 hasOne
的 ORDER BY
子句。
注意:自定义查找器必须位于关联的目标中,而不是源表中。
【讨论】:
能否同时说明如何为每篇文章获取三个最新的cmets 在查询生成器中应用限制在第二个查询中添加限制子句,所以这没有用 添加限制会将限制应用于整个查询。所以如果有 5 篇文章,如果你想要每篇文章的第一个评论,你总共只会得到一个评论。以上是关于CakePHP 3 的关联限制不起作用的主要内容,如果未能解决你的问题,请参考以下文章
CakePHP 2.3.2 BasicAuthentication 不起作用
CakePHP 3 - beforeSave 回调在编辑时不起作用