2015-03-09 2 views
0

Я работаю с двумя моделями, UserType и User - UserTypehasManyUser.Laravel 4.2 - Использование, где пункт о связанных таблицах

Я пытаюсь получить список пользователей, связанных с UserType, который имеет свойство receive_email, установленное в 1 (true).

Я попытался:

$userGroups = UserType::with(['Users' => function($query) { 
     $query->whereReceiveEmail(1)->whereNotNull('email')->whereNull('status'); 
    }])->whereIn('id', [10, 1])->get(); 

и где положение, кажется, полностью игнорируется. Из Laravel 4.2 Docs -

$users = User::with(array('posts' => function($query) 
{ 
    $query->where('title', 'like', '%first%'); 

}))->get(); 

Я видел много людей говорят, что это не правильный способ использовать нетерпеливые ограничения загрузки, но я действительно не знаю, что это было бы, они, кажется, не делать ничего. Итак, короткий вопрос, как я могу получить список Users с receive_email, установленным в 1 через отношение UserType?


UPDATE Может кто-нибудь объяснить мне, что пример кода из документации выше предполагается сделать? Я предполагаю, что он должен возвращать сообщения, связанные с пользователями, которые соответствуют ограничению наличия заголовка LIKE «первым». В моем случае я пытаюсь найти пользователей, связанных с UserTypes, где каждый пользователь имеет receive_email, установленный в 1. Единственные существенные различия между моим кодом и примером кода - это то, что я применяю whereIn(), а имена моделей разные.

Итак, с результатами, приведенными в данном примере, можно было бы утверждать следующее?

foreach ($users as $user) { 
    foreach ($user->posts as $post) { 
    // matching posts with titles LIKE "first" 
    } 
} 
+1

Вам нужно 'whereHas'. Но ваш вопрос неясен - вы говорите о Пользователях, связанных с UserType, соответствующих некоторым условиям, но вместо этого вы запрашиваете Пользователей. –

+0

Если вы имеете в виду второй фрагмент кода, это из документов Laravel 4.2 (как уже упоминалось). Если вы ссылаетесь на первый, 'UserType' является моделью, которую я запрашиваю. И не могли бы вы объяснить, где, как это относится к этому? – NightMICU

+0

Нет, я не имею в виду пример документов, но ваш. Лукас уже дал вам код, поэтому вы знаете, что там не так. –

ответ

1

Если вы после списка пользователей, то я предлагаю вам на самом деле начать с этой моделью и использовать whereHas для фильтрации по типу пользователя:

$users = User::where('receive_email', 1) 
      ->whereNotNull('email') 
      ->whereNull('status') 
      ->whereHas('UserType', function($q){ 
       $q->whereIn('id', [1, 10]); 
      }) 
      ->get(); 

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

$users = User::where('receive_email', 1) 
      ->whereNotNull('email') 
      ->whereNull('status') 
      ->whereIn('user_type_id', [1, 10]); 
      ->get(); 

Для RosterMember это в основном то же самое. Хотя теперь вы должны использовать whereHas, так как это отношение «многие ко многим»:

$rosterMembers = RosterMember::where('receive_email', 1) 
       ->whereNotNull('email') 
       ->whereHas('UserType', function($q){ 
        $q->whereIn('user_type_id', [1, 10]); 
       }) 
       ->get(); 
+0

Никогда не думал о приближении к нему с этого угла. Как насчет отношения «Множество-много»? 'UserType' также' принадлежитToMany() '' RosterMember' – NightMICU

+0

Вы имеете в виду, что хотите отфильтровать два отношения? – lukasgeiter

+0

В идеале, да - первый (Пользователь) является отношением hasMany, второй (RosterMember) является принадлежностью к числу – NightMICU

1

Я не на 100% знаком с отношениями, они всегда были немного сложными. Но от того, что я понимаю, вы хотите, чтобы все в UsersUserType 1 и 10, которые имеют receive_emails набор 1. Итак, это должно работать:

$result = 
    UserType::whereIn("id", array(1, 10)) 
    ->first() 
    ->users() 
    ->where("receive_email", "=", 1) 
    ->whereNotNull("emails") 
    ->whereNull("status") 
    ->get() 
; 

Что это должно сделать, это вернуть все доступные поля и от ид 1 и 10 из UserType, а также все поля из таблицы User. Если запустить dd($result) по этому запросу, вы должны увидеть запись для UserType идентификатора 1, подключенного ко всему Users, которые имеют receive_email набор 1, а другой набор для UserType ид 10.

Я не могу гарантировать, что это будет работать, не видя ваши UserType.php и User.php классов, так как отношения не могут быть установлены, но если вы следовали Laravel конвенции:

public function users(){ 
    return $this->hasMany("User"); 
} 

и обратный

public function userType(){ 
    return $this->belongsTo("UserType"); 
} 

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

Cheers!

+0

Большое спасибо! Итак, для чего нужны целевые ограничения загрузки? Потому что то, что показывают документы, в основном то, что я пытаюсь выполнить, или, по крайней мере, так кажется. И, чтобы сделать это более сложным, возможно ли это сделать с ВТОРОМ соотношением? Существует также отношение BelongsToMany, 'RosterMemberRecipients': принадлежит многим« RosterMember » – NightMICU

+0

. Я уверен, что это возможно, но это может быть вне моего объема знаний. В этом примере, пытаясь вызвать что-то после '-> users() ...-> get() -> roster()' (в качестве примера), он потерпит неудачу, так как '-> get()' возвращает коллекцию и что-то вроде '-> roster()' можно использовать только для одного элемента.Измените это на вопрос, возможно, я неправильно понимаю формулировку: P –

+0

Все хорошо, это хорошее начало. Итак, для чего нужны области запросов? Сегодня отработаны часы. :/ – NightMICU

Смежные вопросы