2013-07-01 31 views
14

我試圖從一個表中選擇所有結果,並在用戶ID匹配時與另一個表合併。Laravel 4查詢生成器:LEFT JOIN ... AND ...查詢

我有三個表:運行,用戶和run_user數據透視表。我想從「運行」中選擇所有結果,並選擇數據透視表中的其他列(「已完成」,「粘滯」,「最後測試」和「難度」),但僅從當前用戶的run_user中提取數據。

在原始SQL我已經成功地做到這一點通過LEFT JOIN使用AND語句:

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' 

任何建議如何通過查詢生成器做到這一點?我可以在Laravel 4中執行LEFT JOIN,但無法弄清楚如何將它與AND語句結合使用。

任何幫助表示讚賞。

謝謝!

回答

1

在Laravel 4中,您可以使用Eloquent查詢來執行此操作。我假設你知道雄辯的關係,並知道創建模型。 您的查詢應該是

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

注意 RunUser是run_user表模型。

+0

感謝您的建議。不幸的是,我使用'where'子句有同樣的問題。這適用於run_user表具有運行記錄但不能全部運行的行。 – user2324369

+0

嘗試更改爲'運行:: where('id',$ id) - > leftjoin('run_user','run_user.run_id','=','runs。id') - > first();' –

30

根據你的要求,這是你會怎麼做您的查詢與查詢生成器:

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

但是JOIN語句看起來有點怪異,你可能希望把它轉換成一個正常的WHERE(除非你有一個非常具體的原因直接在JOIN子句中過濾)。

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

文檔:http://laravel.com/docs/queries#joins

+0

謝謝,它看起來好像'andOn'條件不適用於版本4(http://laravel.com/api/class-Illuminate.Database.Query.JoinClause。 html) – user2324369

+0

你說得對,對不起。我編輯了我的答案,你可以做 - > on() - > on()在JOIN上做AND。 –

+4

創建連接字段,然後創建與加入時的2個條件不同的事物。 –

6

如果你想知道我得到這個工作使用DB ::原料的leftJoin參數之一:

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

它並不像「雄辯」我'喜歡它,但沒有工作'和'條件,這似乎是唯一的方法,如果你想添加一個與左連接。

如果任何人都可以建議一個整潔的方式,我很想知道!

謝謝

+2

你可以用 - > leftJoin()和一個閉包 - > on() - > on()來完成,就像我在答案中顯示的那樣,這更清晰。你的雙重JOIN子句也應該是WHERE。 –

+0

我認爲這個解決方案更好。 – Sky

0

Provident和用戶表加入並獲取所有細節的id。

$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

使用本

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

這裏是必須的工作:

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

你能解釋一下它是如何工作的或者它應該做什麼的? –