Здравствуйте и благодарите заранее за ваше время и помощь. У меня 3 очень простые таблицы. Таблица пользователей с user_id, таблица игр с game_id, а также некоторые другие поля (запланированная дата/время) и таблица GamesAttendee, в которой есть только поля user_id и game_id. Я пытаюсь выбрать все игры, к которым подключен пользователь, и возвращать только те, которые запланированы для будущего/прошлого.Состояние реляционной модели Laravel 5
То, что я в конечном итоге происходит с это:
$cur = GamesAttendee::where('user_id',$user_id)->pluck('game_id')->all();
$cur = Game::whereIn('id', $cur)->where('scheduled','>=',$now)->get();
Но я чувствую, что должен быть более эффективный способ сделать это. Я огляделся и пробовал разные вещи, такие как нетерпеливая загрузка и просто возиться с моими моделями, и ничего не работает. Я чувствую, что это очень простой и важный случай, который чрезвычайно распространен, и мне интересно, как это должно быть сделано в ларавеле.
Я попытался:
$cur = Game::with(['attendees'=>function($q) use ($user_id){ return $q->where('user_id',$user_id); }])->where('scheduled','>=',$now)->get();
Но это было не то, что я хотел. Я в основном пытаюсь сделать:
SELECT * FROM GameAttendees
JOIN `games` on games.id = GameAttendees.game_id
WHERE GameAttendees.user_id = 'x' AND games.scheduled >= '2016/05/01' ;
Я быстро записал этот код mysql, чтобы просто игнорировать любые ошибки. Есть идеи?
спасибо.
UPDATE:
Решено, добавив следующую строку в моей модели пользователя:
public function future_games()
{
$now = gmdate('Y-m-d H:i:s',strtotime('+4 hours'));
return $this->belongsToMany('App\Game','games_attendees')->where('scheduled','>=',$now);
}
затем в мой контроллер, я был в состоянии сделать:
$future_games = User::with('future_games')->get();
Что это такое. 'dd (Game :: with (['attendees' => function ($ q) use ($ user_id) {return $ q-> где ('user_id', $ user_id);}])> где ('запланировано' , '> =', $ now) -> toSql()); ' – slapyo
Вы можете: $ cur = Game :: whereScheduled ('> =', '$ now') -> whereHas (['attendees' => function ($) { $ q-> whereUserId ($ user_id); }]) -> get(); dd ($ cur) и опубликуйте свои результаты – ExohJosh
Проблема с интенсивной загрузкой заключается в том, что она по-прежнему возвращает игры в будущем. Мне нужно, чтобы он ничего не возвращал, если никто не посещает.Вы можете видеть, что сначала я получаю список игровых_идей, которые посещают пользователь, и ТОГДА Я смотрю этот список и отфильтровываю тот, который запланирован на будущее. Таким образом, я ТОЛЬКО получаю игры, которые пользователь посещает, которые находятся в будущем. Опять же, я ценю вашу помощь и ответы. –