Laravel渴望加载,仅当ID可用时

时间:2019-02-20 08:55:27

标签: php mysql laravel eloquent laravel-query-builder

我有一张这样的桌子:

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

使用Laravel的热切加载,我可以执行此操作-> load('client','vendor'...)并加载payments的所有返回行的关系。但是我注意到,例如,当payments的{​​{1}}中没有值时,仍然会急切地查询“供应商”关系,如下所示:

vendor_id

我了解的select * from `vendors` where `vendors`.`id` in ('') 应该用in ('')表中vendor_id的值填充,但是由于没有上述查询应该不会发生,对吧?那是Laravel中的错误吗?

问题在于,我在此payments表中有20个[x]_id列,并且每行中只有几行(各行各不相同)payments列中有值,而我不想进行20个额外的紧急加载查询,仅根据实际存在的ID进行查询!

1 个答案:

答案 0 :(得分:0)

在执行lazy紧急加载时,laravel不知道记录是否存在。如果不存在,laravel返回空集合。

如果您想一开始就过滤掉以仅显示具有供应商和客户等的付款,则可以执行以下操作:

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

以上只会给您至少包含一个供应商和1个客户的付款。

此外,您正在使用load(),这是延迟加载的。它的设计使您可以先获取主要集合,然后在需要时再获取主要集合。

如果您不想延迟加载,请检查with()

此外,如果您想避免急于加载,可以使用join,但是再次使用,则将不再使用已定义的关系。