Cakephp 传递条件给包含的对象会引发 InvalidArgumentException。

问题描述 投票:0回答:1

我想通过传递一个条件(limit)来限制加入的结果。->contain('ProductCategory')

$products = $ProductTable
    ->find('all')
    ->where($where)
    ->contain(
        [
            'ProductPrice' => [
                'ProductPricetier'
            ],
            'ProductCategory' => [
                'sort' => ['ProductCategory.id DESC']
            ]
        ],
        function (Query $q) {
            return $q->limit(1);
        }
    );

抛出一个异常。

不能设置包含项。要使用$queryBuilder,$associations必须是一个字符串。

如何限制单个关联的结果?

cakephp associations query-builder cakephp-4.x
1个回答
2
投票

我不确定你的例子的格式是否和你最初发布的一样,但是按照我编辑的正确格式,你应该看到你没有把闭包作为一个包含的选项来传递,而是作为第二个参数传递给了 contain() 方法,只有当第一个参数是一个字符串(如错误信息中提到的),特别是一个关联别名时,该方法才有效。

例如,你需要做

->contain([
    'ProductPrice' => [
        'ProductPricetier'
    ],
    'ProductCategory' => function (Query $q) {
        return $q
            ->order([
                'ProductCategory.id' => 'DESC'
            ])
            ->limit(1);
    },
]);

或者

->contain('ProductCategory', function (Query $q) {
    return $q
        ->order([
            'ProductCategory.id' => 'DESC'
        ])
        ->limit(1);
});

这就是说,这可能不会像你想象的那样工作,因为在一个包含中的限制并不是以每行组为基础的,而是会被忽略的 belongsTohasOne 协会,以及 hasManybelongsToMany 关联,它将应用于整个二级关联数据查询,限制整个检索到的关联记录,即它将总共只返回1条关联记录,而不是每个行组1条。

例如,检查 如何限制每个记录组包含的关联? 关于如何限制每个行组的关联的信息。

另请参阅

© www.soinside.com 2019 - 2024. All rights reserved.