Как выполнить этот сложный запрос с Eloquent? - PullRequest
0 голосов
/ 24 июня 2018

У меня есть этот запрос ниже, чтобы получить электронную почту всех пользователей, которые зарегистрированы в определенной конференции.

$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), и у этой регистрации 1 или более участников, связанных с определенным типом регистрации.

Знаете ли вы, как правильно выполнить этот запрос?У меня есть код ниже, но он показывает «Вызов неопределенного отношения [Регистрация] на модели [App \ Conference]».

$getEmailsOfAspecificRegistrationType = 
 Conference::with('registrations', 
 'Registration.registrationTypes', 'Registration.registrationTypes.participants')
->where('id', $id)->get();

Структура таблицы и пример, чтобы лучше объяснить контекст:

Например, существует конференция «Конференция 1», которая имеет два типа регистрации (rt1 и rt2).А пока в конференции «Конференция 1» всего две регистрации.Одна регистрация была сделана Джейком, а другая Беном.Джейк сделал регистрацию с 3 участниками (он, Джейн и Пол).Бен только сделал для него регистрацию.Структура таблиц выглядит следующим образом.

Я хочу получать только электронные письма пользователей, которые зарегистрировались в конференции с идентификатором «1», и у этой регистрации 1 или более участников, связанных с определенным типом регистрации,например "rt01".Поэтому в этом случае я хочу получить только электронное письмо от пользователя 1 «jakeemailtest», потому что это единственный участник, который выполнил регистрацию, связанную с типом регистрации «rt01», поскольку участники Джейк и Джейн связаны с этим типом регистрации (как можно проверить в таблице участников).

Таблица конференций:

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');
}

Ответы [ 2 ]

0 голосов
/ 24 июня 2018

В соответствии с вашей схемой, похоже, что определения вашей модели должны выглядеть как

  • У пользователя есть регистрации => Регистрация принадлежит пользователю
  • Регистрация имеет участников => Участник принадлежит регистрации
  • Тип регистрации имеет участников => Участник принадлежит типу регистрации
  • Конференция имеет типы регистрации => Тип регистрации принадлежит конференции
  • У конференции есть регистрации => Регистрация принадлежит конференции

Учитывая вышеизложенное, ваша модель конференции также должна иметь следующее отображение

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
0 голосов
/ 24 июня 2018

Вы указываете неправильные имена отношений.Строки, которые вы указываете в методе with(), должны соответствовать имени метода отношения в модели.Правильный способ активировать отношения загрузки:

$getEmailsOfAspecificRegistrationType = Conference::with(
    'registrations.participants'
) ->where('id', $id)->get();

Также обратите внимание, что вам не нужно явно загружать каждое отношение.Когда вы стремитесь загрузить вложенные отношения, автоматически загружаются отношения более высокого порядка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...