下面我有一个查询,以获取所有在特定会议中注册的用户的电子邮件。
$users = User::whereHas('registrations', function ($query) use($conferenceID) {
$query->where('conference_id', '=', $$conferenceID);
})->get();dd($users)显示array:2 [▼ 0 => "....mail.com" 1 => "....mail.com"]。所以它很好用。
但是我只想得到在特定会议($conferenceID)中进行注册的用户的电子邮件,并且这个注册有一个或更多的参与者与特定的注册类型相关联。
您知道如何正确地实现此查询吗?我有下面的代码,但它显示了“调用模型应用程序\会议上的未定义关系注册”。
$getEmailsOfAspecificRegistrationType =
Conference::with('registrations',
'Registration.registrationTypes', 'Registration.registrationTypes.participants')
->where('id', $id)->get();表结构和示例以更好地解释上下文:
例如,有一个会议“会议1”,它有两种注册类型(rt1和rt2)。目前,“第一次会议”只有两次登记。一次登记是杰克做的,另一次是本做的。杰克为3名参与者(他、简和保罗)做了登记。本只为他做了登记。表格结构如下所示。
我只想得到在会议中使用id "1“进行注册的用户的电子邮件,并且这个注册有一个或多个与特定注册类型相关的参与者,例如"rt01”。因此,在本例中,我只想获得用户1 "jakeemailtest“的电子邮件,因为只有参与者进行了与注册类型"rt01”相关联的注册,因为参与者Jane与此注册类型相关联(可以在participants表中签入)。
会议桌:
id name
1 Conference 1用户表:
id name email
1 Jake jakeemailtest@test...
2 Ben benmailtest@test...登记类型表:
id name conference_id
1 rt1 1
2 rt2 1与会者表:
id registration_id registration_type_id name
1 1 1 Jake
2 1 1 Jane
3 1 2 Paul
4 2 2 Ben 登记表如下:
id status user_that_did_registration conference_id
1 Incomplete 1 1
2 Incomplete 2 1问题的相关模型:
用户模型:
public function registrations(){
return $this->hasMany('App\Registration','user_that_did_registration');
}登记模式:
// user that did the registration
public function customer(){
return $this->belongsTo(User::class, 'user_that_did_registration', 'id');
}
public function participants(){
return $this->hasMany('App\Participant');
}
public function conference(){
return $this->belongsTo('App\Conference');
}会议模式:
public function registrations(){
return $this->hasMany('App\Registration', 'conference_id');
}参加者模式:
public function registration(){
return $this->belongsTo('App\Registration');
}
public function registration_type(){
return $this->belongsTo('App\RegistrationType');
}发布于 2018-06-24 12:34:04
根据您的模式,您的模型定义应该如下所示
考虑到以上情况,您的会议模型还应该有以下映射
public function registration_types(){
return $this->hasMany('App\RegistrationType', 'conference_id');
} 您可以使用以下方法获得所需的用户
$users = User::whereHas('registrations.participants.registration_type', function ($query) use ($conference_id, $request) {
$query->where('name', '=', $request->rype)
->where('conference_id', '=', $conference_id);
})->whereHas('registrations', function ($query) use ($conference_id) {
$query->where('conference_id', '=', $conference_id);
})->get(); // use pluck('email') instead of get to select only email发布于 2018-06-24 12:29:45
您指定了错误的关系名称。在with()方法中提供的字符串应该与模型上的关系方法名称相匹配。实现紧急加载关系的正确方法是:
$getEmailsOfAspecificRegistrationType = Conference::with(
'registrations.participants'
) ->where('id', $id)->get();还要注意,您不需要显式地加载每个关系。当您急切地加载嵌套关系时,将自动加载较高级别的关系。
https://stackoverflow.com/questions/51009463
复制相似问题