我有以下代码可以计算会议的注册数量:
$registrationsCount = $conference->registrations->count();
它可以正常显示特定会议中的正确注册数量。但是,必须要获得在会议中注册的参与者的数量,因为一个注册可以关联多个参与者。你知道要实现吗?
在ID为1的会议中具有3个注册的Db结构示例。ID为3的注册具有关联的2个参与者,其他2个注册仅具有1个参与者。
会议表:
id name
1 conference test 1
注册表:
id conference_id user_that_did_registration
1 1 2
2 1 2
3 1 2
参与者表:
id registration_id registration_type_id name
1 1 1 Jake
2 2 1 John
3 3 1 Paul
4 3 2 Peter
参与者模型:
class Participant extends Model
{
public function registration(){
return $this->belongsTo('App\Registration');
}
public function registration_type(){
return $this->belongsTo('App\RegistrationType');
}
}
注册模型:
class Registration extends Model
{
public function customer(){
return $this->belongsTo(User::class, 'user_that_did_registration', 'id');
}
public function participants(){
return $this->hasMany('App\Participant');
}
public function registration_types(){
return $this->belongsToMany('App\RegistrationType', 'participants');
}
public function conference(){
return $this->belongsTo('App\Conference');
}
}
会议模型:
class Conference extends Model
{
public function registrationTypes(){
return $this->hasMany('App\RegistrationType', 'conference_id');
}
public function registrations(){
return $this->hasMany('App\Registration', 'conference_id');
}
}
不要像“ $ registrationsCount = $ conference-> registrations-> participants-> count();”那样工作。它显示“此集合实例上不存在属性[参与者]。”。
答案 0 :(得分:0)
您应尝试将collections的嵌套collection属性称为方法:
$conference->registrations->participants()->count();
此外,也许您应该为参与者传递外键:
class Registration extends Model
{
public function customer(){
return $this->belongsTo(User::class, 'user_that_did_registration', 'id');
}
public function participants(){
return $this->hasMany('App\Participant', 'registration_id');
}
public function registration_types(){
return $this->belongsToMany('App\RegistrationType', 'participants');
}
public function conference(){
return $this->belongsTo('App\Conference');
}
}
最后,尝试在会议模型中添加hasManyThrough:
class Conference extends Model
{
public function registrationTypes(){
return $this->hasMany('App\RegistrationType', 'conference_id');
}
public function registrations(){
return $this->hasMany('App\Registration', 'conference_id');
}
public function participants(){
return $this->hasManyThrough('App\Participant', 'App\Registration', 'conference_id');
}
}