Cake php Условия прохождения, чтобы содержать броски InvalidArgumentException - PullRequest
0 голосов
/ 24 апреля 2020

Я хочу ограничить объединенные результаты, передав условие (ограничение) в ->contain('ProductCategory')

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

, выдает исключение:

Невозможно установить содержимое. Чтобы использовать $ queryBuilder, $ ассоциация должна быть строкой

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

1 Ответ

2 голосов
/ 24 апреля 2020

Я не уверен, что ваш пример был отформатирован так же, как вы его изначально опубликовали, но при правильном форматировании, как я его отредактировал, вы должны увидеть, что вы не передаете закрытие как вариант для сдерживание, но в качестве второго аргумента метода 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);
});

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

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

См. также

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...