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

Laravel多表关联模型集合添加Where条件的方法咨询

解决Laravel模型关联查询时筛选未删除任务的问题

你的问题出在调用get()之后再用where——get()会立即执行SQL查询并返回集合(Collection),此时的where是集合的方法,不是数据库查询构建器的方法,所以不能用tasks.deleted这种带表名的写法,而且会先拉取所有数据再在内存中过滤,既低效又容易出错。

正确的做法是在数据库查询阶段就添加筛选条件,也就是在get()之前调用where:

基础写法

$results = Tasks::with('resource')->where('deleted', 0)->get();

这里假设Tasks模型对应的表是tasks,deleted字段为0代表未删除。如果你的deleted是布尔类型,也可以写where('deleted', false)。

明确指定表名(避免字段冲突)

如果你的查询涉及多表,担心deleted字段名重复,可以明确指定表名:

$results = Tasks::with('resource')->where('tasks.deleted', 0)->get();

这种写法会直接在生成的SQL中添加WHERE tasks.deleted = 0条件,只查询符合要求的数据,效率更高。

额外:同时筛选关联表的未删除数据

如果需要同时确保关联的resource数据也是未删除的,可以用闭包给关联查询加条件:

$results = Tasks::with(['resource' => function ($query) {
    $query->where('deleted', 0);
}])->where('deleted', 0)->get();

内容的提问来源于stack exchange,提问作者bart2puck

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 14:35:20