CakePHP 3关联限制不起作用

时间:2017-12-13 06:01:45

标签: cakephp associations cakephp-3.0

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

更改提取策略

您可能已经知道,在主查找器查询中使用JOIN加载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);
        }
    ]
]);

感谢

1 个答案:

答案 0 :(得分:0)

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

如果您想使用hasOne,还必须对ORDER BY使用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不会删除ORDER BY的{​​{1}}子句。

  

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