CakePHP 3关联限制不起作用

CakePHP 3关联限制不起作用,cakephp,associations,cakephp-3.0,Cakephp,Associations,Cakephp 3.0,下面是cakephp文档中不起作用的行 改变抓取策略 您可能已经知道,belongsTo和hasOne关联是使用主查找器查询中的联接加载的。虽然这提高了查询和获取速度,并允许在检索数据时创建更具表现力的条件,但如果要将某些子句应用于关联的查找器查询,例如order()或limit(),则可能会出现问题 例如,如果您希望以关联的形式获取文章的第一条评论: $articles->hasOne('FirstComment', [ 'className' => 'Comments'

下面是cakephp文档中不起作用的行

改变抓取策略

您可能已经知道,belongsTo和hasOne关联是使用主查找器查询中的联接加载的。虽然这提高了查询和获取速度,并允许在检索数据时创建更具表现力的条件,但如果要将某些子句应用于关联的查找器查询,例如order()或limit(),则可能会出现问题

例如,如果您希望以关联的形式获取文章的第一条评论:

$articles->hasOne('FirstComment', [
     'className' => 'Comments',
     'foreignKey' => 'article_id'
]);
为了正确地从该关联中获取数据,我们需要告诉查询使用select策略,因为我们希望按特定列排序:

$query = $articles->find()->contain([
    'FirstComment' => [
        'strategy' => 'select',
        'queryBuilder' => function ($q) {
            return $q->order(['FirstComment.created' =>'ASC'])->limit(1);
        }
    ]
]);

感谢在使用
hasOne
时注意,在调用
queryBuilder
之后,CakePHP将从查询中删除
ORDER BY
子句。
queryBuilder
用于为
JOIN
子句创建连接条件。没有SQL语法允许联接的
ON(expression)
中的
orderby
子句

如果要使用
orderby
,您还必须为
hasOne
使用选择策略

您可以通过使用自定义查找器来解决此问题

    $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']);
    }
当自定义查找程序添加
hasOne
时,CakePHP不会删除
orderby
子句

注意:自定义查找器必须位于关联的目标表中,而不是源表中


使用
hasOne
时,请注意,调用
queryBuilder
后,CakePHP将从查询中删除
orderby
子句。
queryBuilder
用于为
JOIN
子句创建连接条件。没有SQL语法允许联接的
ON(expression)
中的
orderby
子句

如果要使用
orderby
,您还必须为
hasOne
使用选择策略

您可以通过使用自定义查找器来解决此问题

    $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']);
    }
当自定义查找程序添加
hasOne
时,CakePHP不会删除
orderby
子句

注意:自定义查找器必须位于关联的目标表中,而不是源表中


“不工作”不是正确的问题描述!即使这个问题对于了解CakePHP内部结构的人来说是显而易见的,但请始终尽可能具体地说明到底发生了什么,以及您希望发生什么。请不要只转储烹饪书示例,向我们展示您的关联、代码、数据,并描述您的具体问题,即使您试图复制烹饪书示例-谢谢!在我的例子中,一篇文章有很多评论,现在我需要知道如何获得每一篇文章的最新评论,这是你应该在你的问题中详细阐述的。我没有得到,你可以根据我的需要定制谢谢“不工作”不是一个正确的问题描述!即使这个问题对于了解CakePHP内部结构的人来说是显而易见的,但请始终尽可能具体地说明到底发生了什么,以及您希望发生什么。请不要只转储烹饪书示例,向我们展示您的关联、代码、数据,并描述您的具体问题,即使您试图复制烹饪书示例-谢谢!在我的例子中,一篇文章有很多评论,现在我需要知道如何获得每一篇文章的最新评论,这是你应该在你的问题中详细阐述的。我不明白你能不能根据我的需要定制谢谢我的时间你能解释一下如何为每一篇文章获得三条最新评论在查询生成器中应用限制在第二次查询中添加限制子句,所以这是没有用的添加限制将限制应用于整个查询。因此,如果有5篇文章,并且您希望每篇文章都有第一条评论,那么您总共只能得到一条评论。同时,您可以解释如何为每篇文章获得三条最新评论在查询生成器中应用限制在第二次查询中添加限制子句,这样做没有用添加限制将限制应用于整个查询。所以,如果有5篇文章,如果你想要每篇文章的第一条评论,你总共只能得到一条评论。