Laravel在多个联接表上雄辩的'withCount'函数

时间:2019-12-27 12:10:44

标签: laravel eloquent

我有多个hasMany关系,我只希望最后一张表的行计数。

用户可以在特定的日期和时间注册研讨会,因此关系看起来像是'Workshop'-> hasMany'Date'-> hasMany'TimeSlot'-> hasMany'Registration'。

//Workshop Model
public function workshop_dates(){
  return $this->hasMany(WorkshopDate::class);
}

//Date Model
public function workshops(){
  return $this->belongsTo(Workshop::class);
}
public function workshop_times(){
  return $this->hasMany(WorkshopTime::class);
}

//Time Model
public function workshop_dates(){
  return $this->belongsTo(WorkshopDate::class);
}
public function registrations(){
  return $this->hasMany(Registration::class);
}

//Registration Model
public function workshop_times(){
  return $this->belongsTo(WorkshopTime::class, 'workshop_time_id','id');
}

在我的控制器中,我获取了所有具有所有相关日期和时间段的研讨会,但我不希望用户下载所有注册数据。我只希望他们为每个时隙下载注册数量。 我尝试了'withCount'函数:

return Workshop::with('workshop_dates.workshop_times.registrations')->withCount('registrations')

但是这给了我错误“调用未定义的方法App \ Workshop :: registrations()”

因此,我使用hasManyThrough的extended version在Workshop.php中创建了此方法:

public function registrations(){
  return $this->hasManyDeep(Registration::class, [WorkshopDate::class,WorkshopTime::class]);
}

但是,现在我可以获得每个研讨会的总注册数量,而不是每个时隙的注册数量。

我是laravel初学者,正在寻找解决方案很多小时。感谢所有帮助!

1 个答案:

答案 0 :(得分:0)

您可以将withCount()添加到带有这样的闭包的关系上:

Workshop::with(['workshop_dates.workshop_times' => function($q) {
            $q->withCount('registrations');                      
   }, 'workshop_dates.workshop_times.registrations'])
   ->get()

否则,类似这种方法https://stackoverflow.com/a/41166325/4705339