2016-05-09 6 views
2

Здравствуйте и благодарите заранее за ваше время и помощь. У меня 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(); 
+0

Что это такое. 'dd (Game :: with (['attendees' => function ($ q) use ($ user_id) {return $ q-> где ('user_id', $ user_id);}])> где ('запланировано' , '> =', $ now) -> toSql()); ' – slapyo

+0

Вы можете: $ cur = Game :: whereScheduled ('> =', '$ now') -> whereHas (['attendees' => function ($) { $ q-> whereUserId ($ user_id); }]) -> get(); dd ($ cur) и опубликуйте свои результаты – ExohJosh

+0

Проблема с интенсивной загрузкой заключается в том, что она по-прежнему возвращает игры в будущем. Мне нужно, чтобы он ничего не возвращал, если никто не посещает.Вы можете видеть, что сначала я получаю список игровых_идей, которые посещают пользователь, и ТОГДА Я смотрю этот список и отфильтровываю тот, который запланирован на будущее. Таким образом, я ТОЛЬКО получаю игры, которые пользователь посещает, которые находятся в будущем. Опять же, я ценю вашу помощь и ответы. –

ответ

2

Сначала определите многочастичных to-many в моделях вашей игры и пользователя:

class Game extends Model { 
    public function users() { 
    return $this->belongsToMany(User::class, 'GameAttendees'); 
    } 
} 

class User extends Model { 
    public function games() { 
    return $this->belongsToMany(Game::class, 'GameAttendees'); 
    } 
} 

При том, что в месте, вы должны быть в состоянии получить все игры данных пользователя идет с:

$games = $user->games; 

Если вы хотите добавить некоторые дополнительные условия, сделайте следующее:

$futureGames = $user->games()->where('scheduled','>=',$now)->get(); 

Или просто создайте другое отношение в своей модели пользователя:

class User extends Model { 
    public function futureGames() { 
    return $this->belongsToMany(Game::class, 'GameAttendees')->where('scheduled','>=',$now); 
    } 
} 

и получить к ним доступ:

$futureGames = $user->futureGames; 
+0

Да, но есть 3 разных модели и таблицы. Таблица GameAttendees - это всего лишь таблица с двумя столбцами, которая связывает user_id и game_ids. Многие пользователи могут посещать многие игры. Но я собираюсь попытаться реализовать некоторую логику в вашем коде, но я не думаю, что это на 100% то, что я искал. Но опять же, спасибо за вашу помощь уже. –

+0

Это много, многие отношения и с Eloquent вам не нужно определять модель промежуточной таблицы - см. некоторые примеры здесь. https://laravel.com/docs/5.1/eloquent-relationships#many-to-many –

+0

Удивительно, спасибо. Я собираюсь реализовать это сейчас и обновить этот комментарий и пометить ответ, как только я это сделаю. Еще раз спасибо за вашу помощь! –

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