如何提取两列的总和以及 laravel 中的关系计数?

How to pull sum of two columns along with the count of a relation in laravel?

我有两个表:买家和订单。一位买家有很多订单。

我想要所有买家以及特定时间段内订单的订单数量和订单两列(价格、费用)的总和。我可以通过执行以下操作来获得计数,

Buyer::withCount([
    'orders' => fn ($query) => $query
        ->where('created_at', '>=', $dateTo)
])
->get();

但是如何获取指定时间段 ([​​=12=]) 的总和?

要在闭包中使用变量,您需要使用 use() 将其值发送到该函数。

要使用 withSum({relation},{column}),您需要为每个单独调用。

Buyer::withCount([
        'orders' => function ($query) use ($dateTo) { 
            $query->where('created_at', '>=', $dateTo);
        }
    ])
    ->withSum([
        'orders' => function ($query) use ($dateTo) { 
            $query->where('created_at', '>=', $dateTo);
        }
    ], 'price')
    ->withSum([
        'orders' => function ($query) use ($dateTo) { 
            $query->where('created_at', '>=', $dateTo);
        }
    ], 'charge')
    ->get();

withSum() 仅适用于 Laravel 版本 8 或更高版本。

编辑 箭头函数语法

Buyer::withCount([
        'orders' => fn ($query) $query->where('created_at', '>=', $dateTo),
    ])
    ->withSum(['orders' => fn ($query) $query->where('created_at', '>=', $dateTo)], 'price')
    ->withSum(['orders' => fn ($query) $query->where('created_at', '>=', $dateTo)], 'charge')
    ->get();

与您 withSum() 的方式相同,这里是您可以做到的方式

Buyer::withCount([
            'orders' => fn($query) => $query->where('created_at', '>=', $dateTo),
        ])->withSum([
            'orders' => fn($query) => $query->where('created_at', '>=', $dateTo),
        ], 'price')->withSum([
            'orders' => fn($query) => $query->where('created_at', '>=', $dateTo),
        ], 'charge')->get();