范围和“;sum”-查询


Scopes and "sum"-query?

我在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'));