You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 12:32:39