2013-07-01 12 views
14

Ich versuche, alle Ergebnisse aus einer Tabelle auszuwählen und mit einer anderen Tabelle zusammenführen, wenn Benutzer-IDs übereinstimmen.Laravel 4 Abfrage-Generator: LINKE VERBINDUNG ... UND ... Abfrage

Ich habe drei Tabellen: Läufe, Benutzer und eine run_user Pivot-Tabelle. Ich möchte alle Ergebnisse aus 'Läufe' und zusätzliche Spalten in der Pivot-Tabelle (die 'abgeschlossen', 'sticky', 'last_tested' und 'Schwierigkeit') auswählen, aber nur Daten aus run_user für den aktuellen Benutzer ziehen.

In rohen SQL habe ich es geschafft, dies über eine linke Seite mit einem UND-JOIN-Anweisung zu tun:

SELECT 
runs.startpoint, 
runs.startpostcode, 
runs.endpoint, 
runs.endpostcode, 
run_user.completed, 
run_user.sticky, 
run_user.last_tested, 
run_user.difficulty 
FROM runs 
LEFT JOIN run_user ON run_user.run_id=runs.id AND run_user.user_id = '2' 

Irgendwelche Vorschläge, wie diese über den Query Builder zu tun? Ich kann die LINKE VERBINDUNG in Laravel 4 machen, aber ich kann nicht herausfinden, wie man das mit einer AND-Anweisung kombiniert.

Jede Hilfe wird geschätzt.

Danke!

Antwort

1

In Laravel 4 können Sie dies mit Eloquent Abfrage tun. Ich nehme an, dass Sie sich der redegewandten Beziehungen bewusst sind und Modelle erstellen können. Für Ihre Abfrage sollte es

sein
RunUser::where('user_id',$id)->leftjoin('runs','runs.id','=','run_user.run_id')->first(); 

Hinweis RunUser das Modell für run_user Tabelle ist.

+0

Vielen Dank für Ihren Vorschlag. Leider habe ich das gleiche Problem mit der Where-Klausel. Dies funktioniert gut für Zeilen, in denen die run_user-Tabelle einen Datensatz für Läufe enthält, aber nicht alle Läufe. – user2324369

+0

versuchen Sie es in 'Runs :: wo ('id', $ id) -> leftjoin ('run_user', 'run_user.run_id', '=', 'wird ausgeführt.id ') -> first(); ' –

30

Wie Sie gebeten, dies ist, wie Sie Ihre Abfrage mit dem Query Builder tun würde:

DB::table('runs') 
     ->leftJoin('run_user', function($join) 
     { 
      $join->on('run_user.run_id', '=', 'runs.id') 
      ->on('run_user.user_id', '=', '2'); 
     }) 
     ->get(); 

Aber das JOIN-Anweisung ein bisschen komisch aussieht, werden Sie wahrscheinlich, dass in einem normalen WHERE (es sei denn, Sie aktivieren möchten haben einen sehr spezifischen Grund, direkt in der JOIN-Klausel zu filtern).

DB::table('runs')->join('run_user', 'run_user.run_id', '=', 'runs.id')->where('run_user.user_id', '=', '2')->get(); 

Docs: http://laravel.com/docs/queries#joins

+0

Danke, es sieht so aus, als ob die Bedingung' andOn 'nicht mit Version 4 funktioniert (http://laravel.com/api/class-Illuminate.Database.Query.JoinClause. html) – user2324369

+0

Sie haben Recht, sorry. Ich habe meine Antwort bearbeitet, Sie können -> on() -> on() tun, um ANDs auf einem JOIN zu machen. –

+4

Erstellen eines Joins ein Feld und dann ein wo ist nicht das gleiche wie 2 Bedingungen bei Join. –

6

Falls sich jemand fragt, ich habe diese DB Arbeits mit :: roh auf einem der leftJoin Parameter:

DB::table('runs') 
    ->leftjoin('run_user', 'runs.id','=', 
     DB::raw('run_user.run_id AND run_user.user_id = ' . $user->id)) 
    ->get(); 

Es ist nicht so 'eloquent', wie ich Es wäre so, aber ohne eine funktionierende AndOn-Bedingung, das scheint die einzige Möglichkeit zu sein, wenn Sie ein AND zum LINKEN JOIN hinzufügen wollen.

Wenn jemand einen besseren Weg vorschlagen kann, würde ich gerne wissen! Registriert und

Dank

+2

Sie können es tun mit -> leftJoin() und eine Schließung mit -> on() -> on() wie ich in meiner Antwort gezeigt, die viel sauberer ist. Auch Ihre double JOIN-Klausel sollte wirklich eine WHERE sein. –

+0

Ich denke, diese Lösung ist besser. – Sky

0

Provident und Benutzer Tabelle erhalten ID zu allen Details.

$return = DB::table(config::get('databaseconstants.TBL_USER')) 
      ->leftjoin('inex_pf_details', 'inex_users.id', '=', 'inex_pf_details.pf_user_id') 
      ->select('inex_pf_details.*','inex_users.*') 
      ->where('inex_pf_details.id', $id) 
      ->first(); 
    return $return; 
0

Verwendung dieses

DB::table('runs')->select('runs.startpoint','runs.startpostcode','runs.endpoint','runs.endpostcode','run_user.completed','run_user.sticky','run_user.last_tested','run_user.difficulty') 
    ->leftJoin('run_user', function($join) 
    { 
     $join->on('run_user.run_id', '=', 'runs.id') 
     ->where('run_user.user_id', '2'); 
    }) 
    ->get(); 
0

Hier muss sich arbeiten:

DB::table('runs') 
     ->leftJoin('run_user', function($join) use ($user_id) 
     { 
      $join->on('run_user.run_id', '=', 'runs.id') 
      ->where('run_user.user_id', '=', $user_id); 
     }) 
     ->get(); 
+1

Können Sie erklären, wie das funktioniert oder was es tun soll? –

Verwandte Themen