2013-07-01 22 views
14

Tôi đang cố gắng chọn tất cả kết quả từ một bảng và hợp nhất với một bảng khác khi khớp với ID của người dùng.Laravel 4 Query Builder: LEFT JOIN ... AND ... truy vấn

Tôi có ba bảng: chạy, người dùng và bảng tổng hợp run_user. Tôi muốn chọn tất cả các kết quả từ 'chạy' và các cột bổ sung trong bảng tổng hợp (được 'hoàn thành', 'dính', 'last_tested' và 'khó khăn'), nhưng chỉ lấy dữ liệu từ run_user cho người dùng hiện tại.

Trong SQL liệu tôi đã quản lý để thực hiện điều này thông qua một LEFT JOIN với câu lệnh 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' 

Bất kỳ lời đề nghị làm thế nào để thực hiện điều này thông qua Builder Query? Tôi có thể thực hiện LEFT JOIN trong Laravel 4 nhưng không thể tìm ra cách kết hợp điều này với câu lệnh AND.

Mọi trợ giúp đều được đánh giá cao.

Cảm ơn!

Trả lời

1

Trong Laravel 4 bạn có thể thực hiện việc này bằng truy vấn Eloquent. Tôi cho rằng bạn biết về các mối quan hệ Eloquent và biết cách tạo ra các mô hình. Đối với truy vấn của bạn cần

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

Note RunUser là mô hình cho bảng run_user.

+0

Cảm ơn đề nghị của bạn. Thật không may tôi có cùng một vấn đề bằng cách sử dụng mệnh đề 'where'. Điều này làm việc tốt cho các hàng nơi bảng run_user có một bản ghi để chạy nhưng không nhận được tất cả các lần chạy. – user2324369

+0

thử thay đổi thành 'Chạy :: ở đâu ('id', $ id) -> leftjoin ('run_user', 'run_user.run_id', '=', 'chạy.id ') -> first(); ' –

30

Như bạn yêu cầu, đây là cách bạn sẽ làm truy vấn của bạn với những người xây dựng truy vấn:

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

Nhưng đó THAM GIA tuyên bố có vẻ hơi kỳ lạ, có thể bạn muốn biến chúng thành một bình thường Ở ĐÂU (trừ khi bạn có một lý do rất cụ thể để lọc trực tiếp trong mệnh đề JOIN).

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

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

+0

Cảm ơn, có vẻ như điều kiện' andOn 'không hoạt động với phiên bản 4 (http://laravel.com/api/class-Illuminate.Database.Query.JoinClause. html) – user2324369

+0

Bạn đúng, xin lỗi. Tôi đã chỉnh sửa câu trả lời của mình, bạn có thể làm -> on() -> on() để thực hiện AND trên JOIN. –

+4

Tạo một trường tham gia và sau đó một nơi không giống với 2 điều kiện tham gia. –

6

Trong trường hợp bất cứ ai đang tự hỏi tôi đã làm việc này sử dụng DB :: liệu trên một trong những thông số leftJoin:

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

Nó không phải là 'hùng hồn' như tôi 'd như nó được nhưng không có một điều kiện' andOn 'làm việc này có vẻ là cách duy nhất nếu bạn muốn thêm một AND vào LEFT JOIN.

Nếu bất kỳ ai cũng có thể gợi ý cách thức tôi muốn biết!

Cảm ơn

+2

Bạn có thể làm điều đó với -> leftJoin() và đóng với -> on() -> on() như tôi đã trình bày trong câu trả lời của tôi, đó là sạch hơn nhiều. Ngoài ra, mệnh đề JOIN kép của bạn cũng thực sự là một WHERE. –

+0

Tôi nghĩ giải pháp này tốt hơn. – Sky

0

Bảng người dùng và người dùng Tham gia và nhận id cho tất cả các chi tiết.

$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

sử dụng này

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

Dưới đây là phải làm việc:

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

Bạn có thể giải thích cách hoạt động của công việc này hay không? –