代码之家  ›  专栏  ›  技术社区  ›  fefe

如何使相关模型列的和具有雄辩性

  •  0
  • fefe  · 技术社区  · 6 年前

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

    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
    }
    

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

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

    2 回复  |  直到 6 年前
        1
  •  0
  •   Jonas Staudenmeir    6 年前

    为了使加载工作更加迅速,您必须选择 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
    }
    
        2
  •  0
  •   Spholt    6 年前

    试试下面的方法:

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

    它把你的用户集合,按用户的 id 它们将结果集合映射为 minutes 财产 timesheets 雄辩的收藏。

    应该留给每个用户ID花费的总时间的支持集合。

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