Laravel 功能:在控制器中还是在模型中?

Laravel Function : In controller or in model?

我想知道什么是更好的解决方案,使用 Eloquent Query Builder 或直接将所有函数放入我的模型文件中或直接放入控制器中。

我收到了 Table 捐款: ID、user_id、project_id 和金额

A Table 用户: 许多字段,但重要的是 company_id

所以,每个员工都有一个公司。但是每个员工可以为多个项目进行多次捐赠。

例如,我将此功能放入我的 CompaniesController 中以显示所选公司的员工所做的所有捐赠。 :

// Total sum of all donates of the employees
    $total_sum = Donation
        ::join('users', 'donations.user_id', '=', 'users.id')
        ->where('users.company_id', $id)
        ->selectRaw('sum(donations.amount) as sum')
        ->first()
        ->toArray()['sum'];

它工作正常,但我不确定如何将它转换成 Eloquent 查询生成器,我尝试 :

 public function total_sum($company_id)
{
    return $this->hasMany('App\Donation')
        ->join('users', 'donations.user_id', '=', 'users.id')
        ->where('users.company_id', $company_id)
        ->selectRaw('sum(donations.amount) as sum')
        ->first()
        ->toArray()['sum'];



}

但是我只拿到了自己的捐款,其他员工没有。

记录一下,最好的解决方案是什么?将所有功能放入控制器或模型中?

您可以在模型中使用范围来实现您想要的。例子

public function scopeTotalSum($query, $id)
{
    return $query->join('users', 'donations.user_id', '=', 'users.id')
        ->where('users.company_id', $id)
        ->selectRaw('sum(donations.amount) as sum');
}

然后在你的控制器中你可以像这样使用它

$total_sum = Donation::totalSum($id)->first()->toArray()['sum'];

我想你可以把上面这行改成这样;

$total_sum = Donation::totalSum($id)->first()->sum;

希望对您有所帮助