Laravel Eloquent:with()/load()后关联模型条件过滤问题
解决Laravel一对多关联的条件筛选问题
针对你提到的Facture和Item的一对多关联场景,不用DB::类直接操作的话,Laravel的关联查询提供了几种简洁的实现方式:
1. 查询Facture时,加载符合条件的关联Item
如果要在查询Facture的同时,只加载price=30的Item,可以在with()方法中传入闭包来筛选关联数据:
$factures = Facture::with(['items' => function ($query) { $query->where('price', 30); }])->get();
这样返回的每个Facture实例里,items属性只会包含价格为30的条目。
如果需要进一步筛选至少拥有一个符合条件Item的Facture(即排除那些没有任何price=30的Item的Facture),可以结合whereHas()和with():
$factures = Facture::whereHas('items', function ($query) { $query->where('price', 30); })->with(['items' => function ($query) { $query->where('price', 30); }])->get();
2. 针对已有的Facture实例,筛选其关联Item
如果已经获取了单个Facture实例(比如$facture = Facture::find(1);),直接通过关联方法添加条件即可:
// 数据库层面筛选,返回符合条件的Item集合 $filteredItems = $facture->items()->where('price', 30)->get();
注意这里用的是items()(关联查询构建器)而非$facture->items(已加载的集合),前者会在数据库层面执行筛选,效率更高。
如果已经提前加载了所有Item(比如用了load('items')),也可以在内存中筛选集合:
// 集合层面筛选,适合数据量小的场景 $filteredItems = $facture->items->filter(fn($item) => $item->price == 30);
内容的提问来源于stack exchange,提问作者Omid P.
相关产品推荐
相关产品推荐

