Hallo und vielen Dank im Voraus für Ihre Zeit und Hilfe. Ich habe 3 sehr einfache Tabellen. Eine Benutzertabelle mit einer user_id, einer Spieltabelle mit einer game_id sowie einigen anderen Feldern (geplantes Datum/Uhrzeit) und einer GamesAttendee-Tabelle, die nur die Felder user_id und game_id enthält. Ich versuche, alle Spiele auszuwählen, mit denen der Benutzer verbunden ist, und gebe nur diejenigen zurück, die für die Zukunft/Vergangenheit geplant sind.Zustand auf dem relationalen Modell Laravel 5
Was ich werde am Ende mit ist:
$cur = GamesAttendee::where('user_id',$user_id)->pluck('game_id')->all();
$cur = Game::whereIn('id', $cur)->where('scheduled','>=',$now)->get();
Aber ich fühle mich wie es eine effizientere Art und Weise, dies zu tun sein muss. Ich habe mich umgesehen und verschiedene Dinge ausprobiert, wie eifriges Laden und einfach nur mit meinen Modellen zu tun haben und nichts scheint zu funktionieren. Ich fühle mich wie ein sehr einfacher und wichtiger Fall, der extrem häufig ist und ich frage mich, wie das eigentlich in Laravel gemacht werden soll.
Ich habe versucht:
$cur = Game::with(['attendees'=>function($q) use ($user_id){ return $q->where('user_id',$user_id); }])->where('scheduled','>=',$now)->get();
Aber das war nicht das, was ich wollte. Ich versuche im Grunde zu tun:
SELECT * FROM GameAttendees
JOIN `games` on games.id = GameAttendees.game_id
WHERE GameAttendees.user_id = 'x' AND games.scheduled >= '2016/05/01' ;
Ich schrieb schnell diesen mysql-Code, so ignorieren Sie einfach alle Fehler. Irgendwelche Ideen?
Vielen Dank.
UPDATE:
gelöst durch die folgenden in meinem Benutzermodell hinzugefügt:
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);
}
dann in mein Controller konnte ich tun:
$future_games = User::with('future_games')->get();
Was gibt das zurück? 'dd (Spiel :: mit (['Teilnehmer' => Funktion ($ q) verwenden ($ user_id) {return $ q-> wo ('user_id', $ user_id);}]) -> wo ('geplant' , '> =', $ now) -> toSql()); ' – slapyo
Können Sie tun: $ cur = Spiel :: whereScheduled ('> =', '$ now') -> whereHas (['attices' => Funktion ($) { $ q-> whereUserId ($ user_id); }]) -> get(); dd ($ cur) und posten Sie Ihre Ergebnisse bitte – ExohJosh
Das Problem mit einer eifrigen Last ist, dass es immer noch Spiele in der Zukunft zurückgibt. Ich brauche es, um nichts zurückzugeben, wenn niemand anwesend ist.Du kannst sehen, dass ich zuerst eine Liste von game_ids erhalte, an denen der Benutzer teilnimmt, und DANN schaue ich mir diese Liste an und filtere eine, die für die Zukunft geplant ist. Auf diese Weise bekomme ich NUR Spiele, die der Benutzer in der Zukunft besucht. Wieder schätze ich Ihre Hilfe und Antworten. –