Laravel 5 如何使相关模型列的总和具有说服力

Laravel 5 如何使相关模型列的总和具有说服力,laravel-5,model,eloquent,sum,relationship,Laravel 5,Model,Eloquent,Sum,Relationship,我在我的用户模型上有很多关系 公共功能时间表() { 返回$this->hasMany('App\timeline','employee'); } 我想要一列的和 $users=User::select('firstname','lastname')->with('timesheet')->get(); foreach($users作为$user){ //$user->时间表的总和 //尝试了$user->timesheet->sum('minutes'),每次迭代返回0 } 获得正确结果的

我在我的用户模型上有很多关系

公共功能时间表()
{
返回$this->hasMany('App\timeline','employee');
}
我想要一列的和

$users=User::select('firstname','lastname')->with('timesheet')->get();
foreach($users作为$user){
//$user->时间表的总和
//尝试了$user->timesheet->sum('minutes'),每次迭代返回0
}
获得正确结果的最佳方法是什么


问题在于我在用户对象上使用select文件的问题。另一方面,总和非常昂贵,我得到的
允许内存大小为1073741824字节已耗尽

请尝试以下方法:

$users_with_time = $users->keyBy('id')->map(function($user) {
    return $user->sum('timesheets.minutes');
});
它将获取您的用户集合,按用户的
id
对其进行键控,并根据
时间表的
minutes
属性之和映射生成的集合

您应该得到每个用户id花费的总时间的支持集合


我还没有时间测试这一点,但它应该是一个很好的起点。

要想快速加载,您必须选择
用户。id
列:

$users = User::select('id', 'firstname', 'lastname')->with('timesheet')->get();
如果仅获取分钟的
时间表
模型,则可以使用修改的
withCount()

User::withCount(['timesheet as minutes'=>函数($query){
$query->select(DB::raw('sum(minutes)');
}])->get();
foreach($users作为$user){
$user->minutes
}

时间表的内容是否正确?
$user->timesheet->pull('minutes')
的结果是什么?
$total=$user->timesheet->sum('minutes')应该可以正常工作。当你做一个
dd($user->timesheet)时,你看到了什么。您应该能够在那里看到所有相关的时间表条目。如果没有,您可能需要检查密钥和/或查询(debugbar包)。除此之外,您的代码一定会变慢,因为它当前获取所有用户以及与之相关的每个用户的所有时间表条目。我做了一个更新!这真的会返回分钟的总和吗?老实说,我希望它总是返回1。@Namoshek确实返回了。那么对于这个,应该有一个像
withSum()
这样的重载。我想我明天需要试一试…谢谢!它可以工作,但是集合总和非常慢,有没有更好的方法呢?nevermind
$query->select(DB::raw('sum(minutes)')工作正常