【问题标题】:CakePHP 3 limit of association does not worksCakePHP 3 的关联限制不起作用
【发布时间】: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,现在我需要知道如何获取每篇文章的最新评论
  • 这就是您应该在问题中详细说明的内容。 stackoverflow.com/questions/30241975/…
  • 我没有得到你可以根据我的需要定制谢谢

标签: cakephp associations cakephp-3.0


【解决方案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 篇文章,如果你想要每篇文章的第一个评论,你总共只会得到一个评论。
猜你喜欢
  • 2020-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多