首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用雄辩的口才来实现这个复杂的查询?

如何用雄辩的口才来实现这个复杂的查询?
EN

Stack Overflow用户
提问于 2018-06-24 11:26:17
回答 2查看 58关注 0票数 1

下面我有一个查询,以获取所有在特定会议中注册的用户的电子邮件。

代码语言:javascript
运行
复制
$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)中进行注册的用户的电子邮件,并且这个注册有一个或更多的参与者与特定的注册类型相关联。

您知道如何正确地实现此查询吗?我有下面的代码,但它显示了“调用模型应用程序\会议上的未定义关系注册”。

代码语言:javascript
运行
复制
$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表中签入)。

会议桌:

代码语言:javascript
运行
复制
id         name
1            Conference 1

用户表:

代码语言:javascript
运行
复制
id           name           email
1             Jake            jakeemailtest@test...
2             Ben             benmailtest@test...

登记类型表:

代码语言:javascript
运行
复制
id   name     conference_id
1    rt1          1
2    rt2         1

与会者表:

代码语言:javascript
运行
复制
id     registration_id      registration_type_id      name        
1         1                        1                   Jake 
2        1                        1                    Jane
3        1                       2                     Paul
4        2                      2                      Ben         

登记表如下:

代码语言:javascript
运行
复制
id   status                user_that_did_registration       conference_id 

1         Incomplete            1                                     1
2        Incomplete             2                                     1

问题的相关模型:

用户模型:

代码语言:javascript
运行
复制
public function registrations(){
    return $this->hasMany('App\Registration','user_that_did_registration');
}

登记模式:

代码语言:javascript
运行
复制
// 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');
}

会议模式:

代码语言:javascript
运行
复制
 public function registrations(){
    return $this->hasMany('App\Registration', 'conference_id');
}

参加者模式:

代码语言:javascript
运行
复制
public function registration(){
    return $this->belongsTo('App\Registration');
}

public function registration_type(){
    return $this->belongsTo('App\RegistrationType');
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-24 12:34:04

根据您的模式,您的模型定义应该如下所示

  • 用户有注册=>注册属于用户
  • 注册有参与者=>参与者属于注册
  • 注册类型有参与者=>参与者属于注册类型
  • 会议有注册类型=>注册类型属于会议
  • =>注册属于会议

考虑到以上情况,您的会议模型还应该有以下映射

代码语言:javascript
运行
复制
public function registration_types(){
    return $this->hasMany('App\RegistrationType', 'conference_id');
} 

您可以使用以下方法获得所需的用户

代码语言:javascript
运行
复制
$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
票数 0
EN

Stack Overflow用户

发布于 2018-06-24 12:29:45

您指定了错误的关系名称。在with()方法中提供的字符串应该与模型上的关系方法名称相匹配。实现紧急加载关系的正确方法是:

代码语言:javascript
运行
复制
$getEmailsOfAspecificRegistrationType = Conference::with(
    'registrations.participants'
) ->where('id', $id)->get();

还要注意,您不需要显式地加载每个关系。当您急切地加载嵌套关系时,将自动加载较高级别的关系。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51009463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档