2016-05-09 15 views
2

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(); 
+0

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

+0

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

+0

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. –

Antwort

2

Zuerst definieren viel to-many relation in deinen Spiel- und Benutzermodellen:

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'); 
    } 
} 

, die mit an Ort und Stelle sollten Sie alle Spiele gegeben Benutzer besucht mit bekommen können:

$games = $user->games; 

Wenn Sie einige zusätzliche Bedingungen hinzufügen möchten, gehen Sie wie folgt vor:

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

Or erzeuge einfach eine neue Beziehung in Ihrem User-Modell:

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

und greifen sie von:

$futureGames = $user->futureGames; 
+0

Ja, aber es gibt 3 verschiedene Modelle und Tabellen. Die GameAttendees-Tabelle ist nur eine 2-Spalten-Tabelle, die user_id und game_ids verbindet. Viele Benutzer können viele Spiele besuchen. Aber ich werde versuchen, einige der Logik in Ihrem Code zu implementieren, aber ich glaube nicht, dass es 100% ist, was ich suchte. Aber noch einmal, vielen Dank für Ihre Hilfe .. –

+0

Es ist eine viel zu viele Relationen und mit Eloquent müssen Sie das Modell für die Zwischentabelle nicht definieren - sehen Sie einige Beispiele hier https://laravel.com/docs/5.1/eloquent-relationships#many-to-many –

+0

Ehrfürchtig, danke. Ich werde das jetzt implementieren und werde diesen Kommentar aktualisieren und die Antwort markieren, sobald ich es getan habe. Nochmals vielen Dank für Ihre Hilfe! –