如何在将集合数据传递至视图前检查关联数据?基于Eloquent关联的简化实现方案
优化Eloquent关联筛选的简写方法
当然有更简洁的实现方式啦!你可以直接利用Eloquent的关联查询能力,把筛选逻辑交给数据库来处理,完全不需要循环遍历或者array_push,代码更清爽,性能也更好。
这里有两种写法推荐给你:
基础写法(兼容所有支持闭包的Laravel版本)
public function awaiting() { $producers_list = Producer::where('producer_process', 4) ->whereHas('brand', function ($query) { $query->where('brand_rejected', 0); }) ->get(); return view('admin.brands.awaiting', compact('producers_list')); }
箭头函数简写(Laravel 7+支持)
如果你的Laravel版本在7及以上,可以用更简洁的箭头函数进一步简化代码:
public function awaiting() { $producers_list = Producer::where('producer_process', 4) ->whereHas('brand', fn($query) => $query->where('brand_rejected', 0)) ->get(); return view('admin.brands.awaiting', compact('producers_list')); }
为什么这样写更好?
- 性能优化:原来的写法是先把所有
producer_process=4的记录查出来,再在PHP里循环筛选关联的Brand条件;而whereHas是直接在数据库层面完成双重条件筛选,减少了数据传输和PHP的处理开销。 - 代码可读性:直接通过链式调用表达业务逻辑,一眼就能看出来你要找的是「流程状态为4,且关联品牌未被拒绝」的生产者数据,比循环筛选更直观。
内容的提问来源于stack exchange,提问作者Pouya Vaghefi
相关产品推荐
相关产品推荐

