我有一张这样的桌子:
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进行查询!
答案 0 :(得分:0)
在执行lazy
紧急加载时,laravel不知道记录是否存在。如果不存在,laravel返回空集合。
如果您想一开始就过滤掉以仅显示具有供应商和客户等的付款,则可以执行以下操作:
$payments : Payment::whereHas('vendors')->whereHas('clients')->get();
以上只会给您至少包含一个供应商和1个客户的付款。
此外,您正在使用load()
,这是延迟加载的。它的设计使您可以先获取主要集合,然后在需要时再获取主要集合。
如果您不想延迟加载,请检查with()
。
此外,如果您想避免急于加载,可以使用join
,但是再次使用,则将不再使用已定义的关系。