2013-07-01 13 views
14

Próbuję wybrać wszystkie wyniki z jednej tabeli i scalić z inną tabelą, gdy dopasowanie ID użytkownika.Laravel 4 Konstruktor kwerend: LEWY DOŁĄCZ ... I ... zapytanie

Mam trzy tabele: przebiegi, użytkowników i tabelę przestawną run_user. Chcę wybrać wszystkie wyniki z "przebiegów" i dodatkowych kolumn w tabeli przestawnej (które są "ukończone", "przyklejone", "ostatnie testowane" i "trudność"), ale tylko pobrać dane z run_user dla bieżącego użytkownika.

surowca SQL udało mi się to zrobić za pomocą LEFT JOIN z I stwierdzeniem:

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' 

Wszelkie sugestie jak to zrobić za pomocą Konstruktora kwerend? Mogę wykonać LEFT JOIN w Laravel 4, ale nie mogę wymyślić, jak połączyć to z instrukcją ORAZ.

Każda pomoc jest doceniana.

Dzięki!

Odpowiedz

1

W programie Laravel 4 można to zrobić, korzystając z kwerendy Eloquent. Zakładam, że jesteś świadomy Wymownych relacji i wiesz, aby tworzyć modele. Dla zapytania powinny być

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

Uwaga RunUser to model dla tabeli run_user.

+0

Dzięki za sugestię. Niestety mam ten sam problem, używając klauzuli "where". Działa to dobrze dla wierszy, w których tabela run_user ma rekord dla uruchomień, ale nie otrzymuje wszystkich uruchomień. – user2324369

+0

spróbuj zmienić na 'Runs :: where ('id', $ id) -> leftjoin ('run_user', 'run_user.run_id', '=', 'działa.id ') -> first(); ' –

30

Jak prosiłeś, to jak byś zrobił zapytanie z budowniczym zapytanie:

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

Ale JOIN wygląda nieco dziwnie, prawdopodobnie chcesz, aby włączyć, że w normalnym GDZIE (chyba, że mieć bardzo konkretny powód do filtrowania bezpośrednio w klauzuli JOIN).

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

Dzięki, wygląda na to, że warunek' andOn 'nie działa z wersją 4 (http://laravel.com/api/class-Illuminate.Database.Query.JoinClause. html) – user2324369

+0

Masz rację, przepraszam. Edytowałem swoją odpowiedź, możesz to zrobić -> on() -> on(), aby wykonać operacje AND na JOIN. –

+4

Tworzenie sprzężenia w polu, a następnie w miejscu, w którym nie jest to samo, co 2 warunki przyłączenia. –

6

W przypadku gdy ktoś zastanawia się, mam to wykonywana przy użyciu DB :: surowca na jednym z parametrów leftJoin:

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

To nie tak 'wymowny' jak ja "podoba się, że jest, ale bez działającego" i "w" stanie to wydaje się być jedynym sposobem, jeśli chcesz dodać znak AND do LEWEGO DOŁĄCZU.

Jeśli ktokolwiek może zaproponować lepszy sposób, chciałbym to wiedzieć!

Dzięki

+2

Możesz to zrobić za pomocą -> leftJoin() i zamknięcia za pomocą -> on() -> on(), tak jak pokazałem w mojej odpowiedzi, która jest znacznie czystsza. Również twoja podwójna klauzula JOIN powinna naprawdę być GDZIE. –

+0

Myślę, że to rozwiązanie jest lepsze. – Sky

0

Tabela Provident i użytkownika Dołącz i uzyskaj identyfikator wszystkich szczegółów.

$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

użycie tego

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

Tutaj musi działać:

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

Czy możesz wyjaśnić, jak to działa lub co ma robić? –