我正在尝试通过预先加载来选择我的列值的总和。
我的查询是
$transactions = Service::with(['transactions' => function($query) use ($queryData){
$query->whereIn('status',['Success','Pending','Successful','Processing']);
$query->whereDate('created_at','>=', $queryData);
$query->addSelect(DB::raw("SUM(deducted) as adjustment"));
}]);
但我的回答没有得到任何报酬。
我的结果响应看起来像
"id": "3",
"name": "Service Name",
"transactions": [ ]
但它应该是
"id": "3",
"name": "Service Name",
"adjustment": 30
使用 withCount()
:
$transactions = Service::withCount(['transactions as adjustment' => function($query) use ($queryData){
$query->whereIn('status',['Success','Pending','Successful','Processing']);
$query->whereDate('created_at','>=', $queryData);
$query->select(DB::raw('SUM(deducted)'));
}]);
您可能希望在集合上使用 sum 函数,而不是查询中的原始 SQL。仍然只命中数据库一次:
我不知道扣除的位置,但如果在模型上(从上面的查询中看起来像(,这将为您提供查询的交易的总和:
$adjustment= $transactions->sum('deducted');
或者如果在关系上
$adjustment= $transactions->sum(function ($transaction) {
return $transaction->transaction?->sum('deducted');
});
您也可以使用点表示法获取相关字段:
$adjustment= $transactions->sum('transaction.deducted');
这些允许您保留对象集合($transactions
,以及您指出的必要的name
和id
字段(,并且仍然从原始查询中获取总和。