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 不会删除 hasOneORDER BY 子句。

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

【讨论】:

能否同时说明如何为每篇文章获取三个最新的cmets 在查询生成器中应用限制在第二个查询中添加限制子句,所以这没有用 添加限制会将限制应用于整个查询。所以如果有 5 篇文章,如果你想要每篇文章的第一个评论,你总共只会得到一个评论。

以上是关于CakePHP 3 的关联限制不起作用的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP 2.3.2 BasicAuthentication 不起作用

Cakephp 3:Json 渲染视图不起作用

CakePHP 3 - beforeSave 回调在编辑时不起作用

直接使用分页器并在关联列上定义排序不起作用

使用 xdebug 和 netbeans 调试 CakePHP 2.4 应用程序不起作用

CakePHP 多选“选中”不起作用