我在控制器中有以下查询,以按年显示有关已支付和未支付的订单以及各自的金额(合计)的一些统计数据.然而,我觉得我正在使用的查询可能是优化的,但我找不到更好的方法来做到这一点.这就是我所拥有的:

public function index(Order $order)
{
    $orders = Order::all()->groupBy(function ($order) {
        return $order->created_at->format('Y');
    })->map(function ($year) {
        return $year->sum('total');
    });
    
    $unpaid_orders = Order::all()->where('payment_confirmed', 0)->groupBy(function ($order) {
        return $order->created_at->format('Y');
    })->map(function ($year) {
        return $year->sum('total');
    });
    
    $paid_orders = Order::all()->where('payment_confirmed', 1)->groupBy(function ($order) {
        
        return $order->payment_confirmed == false ? $order->year : $order->created_at->format('Y');
    })->map(function ($year) {
        return $year->sum('total');
    });
    
    return view('orders.index', compact('orders', 'unpaid_orders', 'paid_orders'));
}

在上面,我查询了三次订单模型,似乎可以进行优化.

推荐答案

$collection = Order::all();次,在需要的地方用$collection.

public function index(Order $order)
{
    $collection = Order::all();

    // OR

    $collection = Order::select(['id', 'payment_confirmed', 'total', 'year', 'created_at'])->get();

    $orders = $collection->groupBy(fn ($order) => $order->created_at->format('Y'))
        ->map(fn ($order) => $order->sum('total'));

    $unpaid_orders = $collection->where('payment_confirmed', 0)
        ->groupBy(fn ($order) => $order->created_at->format('Y'))
        ->map(fn ($order) => $order->sum('total'));

    $paid_orders = $collection->where('payment_confirmed', 1)
        ->groupBy(
            fn ($order) => $order->payment_confirmed == false
                ? $order->year
                : $order->created_at->format('Y')
        )
        ->map(fn ($order) => $order->sum('total'));

    return view('orders.index', compact('orders', 'unpaid_orders', 'paid_orders'));
}

Laravel相关问答推荐

为什么Laravel在API请求时返回BadMethodCallException?

Uncaught ReferenceError:未定义require[Shopify PHP React Browser问题]

导出所有客户端不起作用,文件保存时没有名称和扩展名

如何判断用户Electron邮件是否已存在

Laravel Blade:@stop VS @show VS @endsection VS @append

Laravel Eloquent,仅 Select 存在关系的行

使用 Laravel 限制多态多对多关系中的相关记录

如何使用 Eloquent Laravel 更新集合

Laravel Request::input 调用未定义的方法

Laravel:每当我返回一个模型时,总是返回一个与它的关系

将 Laravel Socialite 与 API 一起使用?

Laravel 分页方法不适用于 map 集合?

如果值存在于另一个字段数组中,Laravel 验证规则

Laravel 全部返回 ID 变为 0

在 Laravel 中按用户名查找用户

如何在 Laravel 视图中找到当前语言?

Laravel 5 - 从控制器级别的所有请求对象中删除参数

在我的编辑器中管理上传文件的最佳方式?

复合唯一密钥验证 - laravel

Laravel - artisan不工作