Laravel中scope方法结合Model::all()无法正常使用求助
解决Laravel中"undefined method during"的问题
我一眼就看出问题所在啦——你混淆了**查询构造器(QueryBuilder)和集合(Collection)**的用法!
问题根源
Order::all()会直接执行SQL查询,返回的是Illuminate\Database\Eloquent\Collection实例,而你定义的scopeDuring是给查询构造器用的方法,集合对象根本没有这个方法,所以才会报找不到during的错误。
两种解决方案
方案1:直接用查询构造器(推荐,更高效)
既然你需要统计数量,完全不需要先把所有订单拉到内存里,直接在数据库层面做统计:
// 总订单数 $count = Order::count(); // 符合during条件的订单数 $ordersActive = Order::during()->count();
如果需要后续复用查询构造器,可以这样写:
$orderQuery = Order::query(); $count = $orderQuery->count(); $ordersActive = $orderQuery->during()->count();
方案2:如果已经拿到集合,在内存中过滤(不推荐,数据量大时效率低)
如果你确实需要先获取所有订单集合,再过滤符合条件的,可以把scope的逻辑改成集合的filter方法:
$orders = Order::all(); $count = $orders->count(); $ordersActive = $orders->filter(function ($order) { return !in_array($order->stat, [1,2,3,4]); })->count();
小提示
Laravel的查询作用域(scope)是用来链式构建查询的,必须在QueryBuilder实例上调用——比如Order::query()、Order::where(...)返回的都是查询构造器,这时候才能用->during()。而all()、get()这些方法会执行查询,返回集合,就不能再用scope方法啦。
内容的提问来源于stack exchange,提问作者Bommber
相关产品推荐
相关产品推荐

