Условия передачи Cakephp для содержания выбрасывают InvalidArgumentException

Я хочу ограничить объединенные результаты, передав условие (лимит) в ->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 должна быть строкой.

Как ограничить результат одной ассоциации?


person Jonathan    schedule 24.04.2020    source источник


Ответы (1)


Я не уверен, что ваш пример был отформатирован так же, как вы его изначально опубликовали, но при правильном форматировании, как я его отредактировал, вы должны увидеть, что вы не передаете закрытие как вариант для сдерживания, но в качестве второго аргумента метода contain(), который работает только тогда, когда первый аргумент является строкой (как указано в сообщении об ошибке), в частности, псевдонимом ассоциации.

Вам нужно будет сделать, например:

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

or

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

При этом это, вероятно, не будет работать так, как вы думаете, поскольку ограничение в содержании не работает для каждой строки/группы, вместо этого оно будет игнорироваться для ассоциаций belongsTo и hasOne, а также для hasMany. и belongsToMany ассоциаций, он будет применяться ко всему запросу данных вторичной ассоциации, ограничивая общее количество извлекаемых связанных записей, т. е. он будет возвращать всего 1 связанную запись, а не 1 на строку/группу.

Проверьте, например, Как ограничить содержащиеся ассоциации для каждой записи/группы? для получения информации о том, как ограничить связи для каждой строки/группы.

Смотрите также

person ndm    schedule 24.04.2020