【问题标题】:How to have the sum of a related models column in Eloquent如何在 Eloquent 中获得相关模型列的总和
【发布时间】:2018-12-04 05:20:07
【问题描述】:

我的用户模型上有一个 hasMany 关系

public function timesheet()
    {
        return $this->hasMany('App\TimeTable', 'employee');
    }

我想要一列的总和

$users = User::select('firstname','lastname')->with('timesheet')->get();

foreach($users as $user) {
    //sume of $user->timesheet
    //tried $user->timesheet->sum('minutes') which return on each iteration 0
}

获得正确结果的最佳方法是什么?

问题在于我在用户对象上使用选择文件的问题。另一方面,这笔钱真的很贵,我得到Allowed memory size of 1073741824 bytes exhausted

【问题讨论】:

  • $user->timesheet的内容是否正确? $user->timesheet->pluck('minutes') 的结果是什么?
  • $total = $user->timesheet->sum('minutes'); 应该可以工作。在 foreach 循环中执行 dd($user->timesheet); 时会看到什么。您应该能够在那里看到所有相关的时间表条目。如果没有,您可能需要检查您的密钥和/或查询(调试栏包)。除此之外,您的代码肯定会变慢,因为它当前会获取所有用户以及每个用户与其关联的所有时间表条目。
  • 我更新了!

标签: laravel-5 model eloquent sum relationship


【解决方案1】:

要使即时加载工作,您必须选择users.id 列:

$users = User::select('id', 'firstname', 'lastname')->with('timesheet')->get();

如果您只获取分钟内的timesheet 模型,您可以使用修改后的withCount()

User::withCount(['timesheet as minutes' => function($query) {
    $query->select(DB::raw('sum(minutes)'));
}])->get();

foreach($users as $user) {
    $user->minutes
}

【讨论】:

  • 这真的会返回分钟总和吗?老实说,我希望它总是返回 1。
  • @Namoshek 确实如此。
  • 那么真的应该有一个像withSum() 这样的重载。我想我明天需要试一试......
  • 谢谢!可以,但是收款速度很慢,有没有更好的办法?
  • 没关系$query->select(DB::raw('sum(minutes)')); 工作正常
【解决方案2】:

尝试以下方法:

$users_with_time = $users->keyBy('id')->map(function($user) {
    return $user->sum('timesheets.minutes');
});

它正在获取您的用户集合,通过用户的id 对它们进行键控,然后它们通过timesheets Eloquent 集合的minutes 属性的总和来映射结果集合。

您应该留下一个支持集合,其中包含每个用户 ID 所花费的总时间。

我没有时间对此进行测试,但它应该是一个很好的起点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 2021-11-06
    相关资源
    最近更新 更多