雄辩的-hasManyThrough关系的groupBy和sum()

时间:2018-06-19 22:51:18

标签: database laravel laravel-5 eloquent

我有3个模型,工作,日记,资源。 乔布斯与日记有关系,日记与资源有关系。 我想获取所有与工作相关的资源,并使用

public function labourers()
{
    return $this->hasManyThrough(Resource::class, Diary::class, 'job_id');
}

在我的工作班上。

现在,我想按User_id是Resource中一列的User分组结果,然后显示总小时数。

这是我能得到的最接近的东西。

    $job = Job::where('job_number', 3007)->first();
    $labour = $job->labourers()->get();
    $results = $labour->groupBy('user_id');
    echo $results;

    foreach($results as $result)
    {
        $hours = $result->sum('hours');
        echo $result[0]->user_id." - ";
        echo $hours.". ";
    }

这使我获得了user_id和小时数总和,但是我无法通过在资源模型上设置的关系来访问用户名

 public function user()
{
    return $this->belongsTo(User::class);
}

使用

$result->user->name;

这产生

  

此集合实例上不存在属性[用户]。

如何返回一个集合,使我可以访问用户名和小时总数。

2 个答案:

答案 0 :(得分:1)

您之所以无法访问user,是因为(在这种情况下)groupBy是该集合上的一个方法,该方法返回另一个集合。 首先,急于加载user关系,以使您的代码效率更高:

$labour = $job->labourers()->with('user')->get();

第二,由于您有一个收藏夹,因此可以使用first()代替[0]

$result->first()->user_id

最后,您必须以与访问user相同的方式访问user_id

$result->first()->user

所以,您最终会得到类似的东西:

$job = Job::where('job_number', 3007)->first();
$labourers = $job->labourers()->with('user')->get();
$results = $labourers->groupBy('user_id');

foreach($results as $result)
{
    echo $result->first()->user->name . ' - ' . $result->sum('hours') . '.';
}

答案 1 :(得分:0)

  

您可以尝试

$job = Job::where('job_number', 3007)->with(['labourers' => function($query){
    $query->select('id','user_id', DB::raw('sum(hours) as hours'))->groupBy('user_id');
 }, labourers.user])->first();

 $results = $job->labourers;

 foreach($results as $result){
    print_r($result->user);
    print_r($result->hours);
 }