【问题标题】:Eloquent - groupBy and sum() of hasManyThrough relationshipEloquent - hasManyThrough 关系的 groupBy 和 sum()
【发布时间】:2018-11-28 23:33:49
【问题描述】:

我有 3 个模型 Job、Diary、Resource。 Jobs 与 Diary 有关系,Diary 与 Resource 有关系。 我想获取与作业关联的所有资源并使用

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

在我的工作课上。

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

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

    $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;

这会产生

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

如何返回允许我访问用户名和小时总和的集合。

【问题讨论】:

  • 试试$result[0]->user->name

标签: database laravel laravel-5 eloquent


【解决方案1】:

你可以试试这个

$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);
 }

【讨论】:

    【解决方案2】:

    您无法像那样访问user 的原因是(在这种情况下)groupBy 是集合上的一个方法,它返回另一个集合。 首先,急切地加载user 关系,以便您的代码更高效:

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

    其次,既然你有一个集合,你可以使用first() 而不是[0]

    $result->first()->user_id
    

    最后,您必须像访问 user_id 一样访问 user

    $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') . '.';
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-14
      • 2020-02-02
      • 2016-09-26
      • 1970-01-01
      • 2019-03-26
      • 2015-07-27
      • 1970-01-01
      • 2017-03-30
      相关资源
      最近更新 更多