Laravel Eager Загрузка, только когда идентификаторы доступны - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть такая таблица:

payments
   -id
   -client_id
   -vendor_id
   -product_id
   -item_id
   -..._id

Используя энергичную загрузку Laravel, я могу сделать это -> load ('client', 'vendor' ...) и загрузить отношения для всехвозвращенные строки payments.Но я заметил, что, например, когда в payments нет значений для vendor_id, запрос на загрузку для отношения "поставщик" все еще происходит, как показано ниже:

select * from `vendors` where `vendors`.`id` in ('')

in ('')Я понимаю, что следует заполнить значениями vendor_id в таблице payments, но так как их не было, приведенный выше запрос не должен происходить, верно ?!Это ошибка в Laravel?

Проблема в том, что я получил 20 [x]_id столбцов в этой таблице payments, и в каждой строке только пара (различается для каждой строки) [x]_id столбцы имеютзначений, и я не хочу делать 20 дополнительных загружаемых запросов, только те, которые необходимы на основе фактического существования этих идентификаторов!

1 Ответ

0 голосов
/ 20 февраля 2019

Когда вы делаете lazy нетерпеливую загрузку, laravel не знает, есть ли записи или нет.Если нет, laravel возвращает пустую коллекцию.

Если вы хотите отфильтровать в самом начале, чтобы показывать только платежи, имеющие поставщиков, клиентов и т. Д., Вы можете сделать следующее:

$payments : Payment::whereHas('vendors')->whereHas('clients')->get();

Приведенное выше даст вам только платежи, которые содержат по крайней мереодин поставщик и 1 клиент.

Кроме того, вы используете load(), что требует отложенной загрузки.Он спроектирован таким образом, что вы можете получить первичную коллекцию первыми, а затем, когда и когда вам это нужно, получить только коллекцию отношений.

Проверьте наличие with(), если вы не хотите выполнять отложенную загрузку.

Кроме того, если вы хотите избежать энергичной загрузки, вы можете перейти к join, но, опять же, вы не будете использовать определенные отношения.

...