2016-07-23 5 views
0

Benutzer kann sich für mehrere Turniere anmelden und Jedes Turnier hat einen Score-Datensatz für jeden Benutzer.Verwenden des Abfragebereichs, jedoch mit anderem Abfragemodell - Laravel

Relationship Diagram

Ich habe in Score-Tabelle gehalten User_id die Datensätze eindeutig zu halten.

Ich habe diese Abfrage:

$tournaments = DB::table('tournaments') 
     ->join('scores','tournaments.id','=','scores.tournament_id') 
     ->select('tournaments.*','scores.score','scores.tees') 
     ->where('t_date','<',Carbon::today()) 
     ->where('scores.user_id',$request->user()->id) 
     ->get(); 

I schließt sich vermeiden wollte und verwenden auch Abfragebereich für die Wiederverwendung von where-Klausel '(t_date < Carbon::today())'

Also, das ist die Abfrage ich gekommen bin, oben mit:

//This is in Tournament Model 
public function scopeUpcoming($query) 
{ 
     return $query->where('t_date','>',Carbon::today()); 
} 

$query = Score::with('tournaments') 
     ->upcoming() 
     ->where('user_id',$request->user()->id) 
     ->get(); 

Aber scopeUpcoming() verwendet Abfrage $ und es gibt keine ‚t_date‘ in Score-Tabelle, also muss ich irgendwie Turniere Tabelle und Abfrage auf sie zugreifen zu können. Umgekehrt kann ich nicht mit Tournament :: with ('scores') gehen, da es keine 'user_id' in der Tabelle des Turniers gibt, so dass ich für einen bestimmten Benutzer nicht zugreifen kann.

+0

Und was ist der Grund für die Vermeidung von Joins? –

+0

Ich habe viele Joins in meinen Controllern und ich finde Joins und rohe Abfragen sind eine Art von Hacks und ich verwende am wenigsten Eloquent-Modelle. Ich möchte MVC Framework so lernen wie es entworfen wurde. Ich versuche, Single/Multiple Joins zu vermeiden und eloquente Beziehungen effektiver zu nutzen. –

Antwort

0

sagte Sie, dass Sie nicht mit

Tournament::with('scores') gibt es keine user_id im Turnier Tisch gehen kann, damit ich für einen bestimmten Benutzer erhalten kann nicht.

Eigentlich kann man noch with Methode verwenden, und Sie können die Einzelteile mit einem Verschluss filtern:

Tournament::with(['scores' => function($query) use ($user_id) { 
    $query->where('user_id', $user_id); 
}); 

auch gesagt, Sie:

Ich muss irgendwie zu Turnieren zugreifen Tabelle und Abfrage danach

Sie können das gleiche Stück Code verwenden, um Ihre aktuellen Abfragekette

$query = Score::with(['tournaments' => function($query) { 
      $query->with('t_date, /**/); // Do your stuff here. 
     ]) 
     ->upcoming() 
     ->where('user_id',$request->user()->id) 
     ->get(); 

Hoffen, dass dieses Licht auf Ihren Fall zu ändern.

+0

Ich bin jetzt wirklich verwirrt. Was gilt als Abfrage Umfang und was geht in Controller? Wo füge ich ancientScope() hinzu? Kannst du mir bitte erklären oder zeigen, was wo hingeht? Ich habe so viele Alternativen ausprobiert –

+0

Das ist, was ich bekam: [{"id": 1, "tournament_id": 2, "user_id": 2, "score": 45, "tees": "meisterschaft", "turniere": null}] Turniere Ergebnis scheint leer zu sein, während es Turnier_id: 2 ist, sagt es null? während es nicht ist. $ query = Score :: mit (['turniere' => funktion ($ query) benutze ($ user_id) { $ query-> where ('t_date', '<', Kohlenstoff :: today()); } ]) -> where ('Benutzer-ID', $ Anfrage-> Benutzer() -> ID) -> get(); –

+0

Warte, warte, die "Scope-Funktion" ist etwas, das du an deine Modelle anlegst. Im Controller können Sie alle Ihre Logik (in Ihrem Fall die Abfrage) setzen. –

Verwandte Themen