我有一个有 10000 个用户的表,并且与work_hours
表有关系。
这是我的用户模型以及我如何获得工作时间的总和。
protected $appends = ['sum_work_hours'];
public function work_hours()
{
return $this->hasMany(WorkHour::class);
}
public function getSumWorkHoursAttribute()
{
return $this->work_hours->sum('hours_total');
}
我进行了查询以显示所有用户及其工作时间总和,如下所示:
public function getHoursDatatable()
{
$users = User::with('work_hours')->get();
return Datatables::of($users)->make();
}
这个查询大约需要7-8 秒才能显示非常慢的表。
我知道这是因为汇总了work_hours
每个用户的表中的总工作时间,如果考虑到数据量,我想了解如何优化此查询?
更新:
$users = User::with('work_hours')->select(['users.name', 'users.email']);
return Datatables::of($users)
->add_column('sum_work_hours', function(User $user) {
return $user->work_hours->sum('hours_total');
})
->make();
这给了我一个错误:
DataTables 警告:table id=users-table - Ajax 错误。有关此错误的更多信息,请参阅http://datatables.net/tn/7
更新 2
这有效:
public function getHoursDatatable()
{
$users = User::with('work_hours');
return Datatables::of($users)
->addColumn('sum_work_hours', function(User $user) {
return $user->work_hours->sum('hours_total');
})
->make();
}
但也需要大约7-8 秒才能加载...