2016-04-27 5 views
0

пользователя может иметь много голосов и многие случаев. случай может содержать некоторые из этих голосов.Laravel жадной загрузка: Пропустите, если существует связь

Peter создал три голоса. Он также создал один случай с двумя голосами. У Питера пять голосов.


Я хочу, чтобы извлечь все голоса, которые не часть повода для увеличения производительности.

Это загрузит все голоса:

$oUser->load('votes'); 

Это то, что я сделал до сих пор:

$aLoad = array('votes' => function($query) { 
    $query->whereNotIn('id', json_decode(json_encode(DB::raw('select id from occasions_votes')), true)); 
}); 

Мои проблемы

  1. Это не работает. Это все еще выбирает все голоса, даже если идентификатор существует в таблице event_votes.
  2. Это не похоже на экономию производительности.

Как вы решите его?

Должен ли я выполнять несколько запросов (выборки всех идентификаторов голосов> удалить все идентификаторы голосов, которые существуют в случаях events_votes> выборки голосов оставшихся идентификаторов), или есть прямой способ уйти? (Laravel 4,2)

+0

Мой вопрос: зачем «$ oUser-> load ('votes');' загружать все голоса? Он должен загружать только голоса пользователя, а не голоса пользователя. Похоже, изменение схемы в порядке, и голоса должны быть полиморфными для пользователей и случаев. – user3158900

ответ

2

Попробуйте

App\User::with('votes')->whereHas('votes',function($query){ 
    $query->whereNotIn('id',DB::table('occasions_votes')->get()->lists('id')->all()); 
}) 

надеюсь, что это помогает.

+0

'-> списки ('id')' был способ пойти, не знал этого метода. Но не используйте '-> all()' on '-> lists()', так как '-> lists()' возвращает массив, а не объект. – netzaffin