Cakephp 传递条件以包含抛出 InvalidArgumentException

Cakephp Passing Conditions to Contain throws InvalidArgumentException

我想通过将条件(限制)传递给 ->contain('ProductCategory')

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

抛出异常:

Cannot set containments. To use $queryBuilder, $associations must be a string

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

我不确定您的示例的格式是否与您最初发布时的格式相同,但是按照我在其中编辑的正确格式,您应该会看到您没有将闭包作为包含的选项,但作为 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);
});

也就是说,这可能不会像您想象的那样工作,因为 contain 中的限制在每个 row/group 基础上不起作用,相反它将被忽略 belongsTohasOne 关联,对于 hasManybelongsToMany 关联,它将应用于整个辅助关联数据查询,限制检索的整体关联记录,即它将 return 总共只有 1 条关联记录,而不是每个 row/group.

1 条

检查例如 How to limit contained associations per record/group? 以获取有关如何根据 row/group.

限制关联的信息

另见