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
相关产品推荐
相关产品推荐

