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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:20:47