Красноречивые запросы работают отдельно, но не вместе в подзапросе - PullRequest
2 голосов
/ 06 марта 2019

Я пытаюсь получить некоторые данные с помощью подзапроса, используя Eloquent, но dd ing ничего не возвращает. Отдельно это

    $discountArticles = $discountTableItemIdIn
            ->where('recipient_type', '=', 'article')
            ->toArray();

или это

    $discountArticles = $discountTableItemIdIn
            ->where('recipient_id', '=', $articleId)
            ->toArray();

отлично работает.

Однако, когда я пытаюсь что-то вроде этого, это терпит неудачу (или, скорее, ничего не возвращает):

    $discountArticles = $discountTableItemIdIn->where(function ($subQuery) {
        $subQuery
            ->where('recipient_type', '=', 'article')
            ->where('recipient_id', '=', $articleId);
    })->toArray();

Я знаю, что могу выполнять отдельные запросы для одной и той же коллекции и делать array_merge, но вместо этого я бы хотел, чтобы этот способ работал. Не уверен, что происходит.

1 Ответ

1 голос
/ 06 марта 2019

Итак, $discountTableItemIdIn - это совокупность всей таблицы? Это означает, что вам понадобится другая функция, поскольку логика ->where() в коллекции отличается от того, как она функционирует в экземпляре компоновщика (eloquent).

Попробуйте использовать filter():

$discountArticles = $discountTableItemIdIn->filter(function ($item) use($articleId) {
    return $item->recipient_type == "article" && $item->recipient_id == $articleId;
})->toArray();

Для этого нужно отфильтровать коллекцию $discountTableItemIdIn для записей, которые имеют тип article и recipient_id того, что содержит $articleId, вернуть новую коллекцию и преобразовать ее в массив.

Просто примечание, это довольно неэффективно; вам следует избегать загрузки всей таблицы в коллекцию и просто запрашивать таблицу напрямую, используя логику подзапроса в вашем вопросе.

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