2013-07-01 4 views
14

사용자 ID가 일치 할 때 한 테이블에서 모든 결과를 선택하고 다른 테이블과 병합하려고합니다.Laravel 4 쿼리 작성기 : LEFT JOIN ... AND ... 쿼리

나는 실행, 사용자 및 run_user 피벗 테이블의 세 가지 테이블이 있습니다. 피벗 테이블 ('완료', '끈적임', 'last_tested'및 '어려움')에서 '실행'및 추가 열의 모든 결과를 선택하려고하지만 현재 사용자의 run_user에서 데이터 만 가져옵니다.

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' 

어떤 제안 방법 쿼리 작성기를 통해이 작업을 수행 :

원시 SQL에서 나는 AND 문을 조인 LEFT를 통해이 작업을 수행하기 위해 관리했습니다? Laravel 4에서는 LEFT JOIN을 할 수 있지만이를 AND 문과 결합하는 방법을 알 수는 없습니다.

도움을 주시면 감사하겠습니다.

감사합니다.

답변

1

Laravel 4에서는 Eloquent 쿼리를 사용하여이 작업을 수행 할 수 있습니다. 나는 당신이 묵시적인 관계를 알고 있고 모델을 만드는 것을 알고 있다고 가정합니다. 당신의 쿼리 는 RunUser이 run_user 테이블에 대한 모델이다

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

주의해야한다.

+0

감사합니다. 불행히도 'where'절을 사용하여 동일한 문제가 발생합니다. run_user 테이블에 실행 레코드가 있지만 실행을 모두 얻지 못하는 행에 대해서는 정상적으로 작동합니다. – user2324369

+0

'Runs :: where ('id', $ id) -> leftjoin ('run_user', 'run_user.run_id', '=', '실행으로 변경하십시오.id ') -> first();' –

30

요청한 바와 같이,이 쿼리 빌더 쿼리를 할 것입니다 방법은 다음과 같습니다 (, 당신은 아마 WHERE 정상에 그것을 켜려고

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

그러나 문이 조금 이상한 보이는 가입하면 않는 한 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

필드에 조인을 작성한 후 where는 조인에 대한 2 개의 조건과 동일하지 않습니다. –

6

내가이가 leftJoin 매개 변수 중 하나에 DB :: 원료를 사용하여 워킹 가지고 궁금해 :

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

그것의로하지 '웅변'I '작동하지 않는 것이 좋겠어.'ANDOn '조건은 LEFT JOIN에 AND를 추가하려는 경우 유일한 방법 인 것 같습니다.

누구나 깔끔한 방법을 제안 할 수 있다면 알고 싶을 것입니다!

감사

+2

당신은 -> leftJoin()과 -> on() -> on()을 사용하여 클로저를 할 수 있습니다. 또한 이중 JOIN 절은 실제로 WHERE 절이어야합니다. –

+0

이 솔루션이 더 좋다고 생각합니다. – Sky

0

선견지명과 사용자 테이블로 가입하고 모든 세부 사항에 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

어떻게 작동하는지 또는 어떻게해야하는지 설명해 주시겠습니까? –