我在Laravel 5应用程序中多次使用相同的查询逻辑。我知道有一些范围可以很容易地重用这个逻辑。但这似乎不适用于sum查询。
public function scopeProfit($query)
{
return $query -> sum('in') - $query -> sum('out');
}
在我的应用程序中,我有长长的代码行,比如
# 'latest' is a scope to filter sales of the last three months
$profit = $user -> sales() -> latest() -> sum('in') - $user -> sales() -> latest() -> sum('out');
这是我使用多行的较短行之一。这不是一个真正的问题,但我很想缩短一些线路,比如:
$profit = $user -> sales() -> latest() -> profit();
有办法做到这一点吗?
作用域这类事情的问题是查询作用域期望返回查询。当您运行->sum()
时,您实际上正在执行一种特殊类型的"聚合"查询,因此无法将这种功能烘焙到查询范围中。
还值得一提的是,您在上面的两个sum()
函数中执行了两个查询,而只需一个查询即可轻松实现:
$profit = $user->sales()->latest()->sum(DB::raw('in - out'));