我有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;
这产生
此集合实例上不存在属性[用户]。
如何返回一个集合,使我可以访问用户名和小时总数。
答案 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);
}