2017-03-03 16 views
0

다음과 같은 쿼리는 sql이 약간 복잡 할 수 있습니다. 프레임 워크 laravel로 변환하는 데 문제가 있습니다. 프레임 워크의 laravel 쿼리 결과로 모든 것을 도와주세요. 내 문제는 여기에 laravel 프레임 워크에 하위 선택 쿼리를 만드는 방법을 모르겠다. 고마워.쿼리 작성기를 사용하여 Laravel의 형식이 무엇입니까?

SELECT 
lin_users.status_employee_id, 
    lin_users.id, 
    lin_users.username, 
    lin_users.created, 
    lin_users.modified, 
    lin_employee_attributes.unit_code, 
    lin_employee_attributes.position_code, 
    lin_employee_attributes.begin_date, 
    lin_employee_attributes.end_date, 
    contactnumber.contact_id as phone_number, 
    contactmobile.contact_id as cell_number, 
    contactemail.contact_id as email 

FROM lin_users 
    INNER JOIN lin_status_employees 
    ON lin_users.status_employee_id = lin_status_employees.id 

    INNER JOIN lin_people 
    ON lin_status_employees.person_id = lin_people.id 

    INNER JOIN lin_employee_attributes 
    ON lin_users.status_employee_id = lin_employee_attributes.status_employee_id 

    LEFT JOIN lin_contacts AS contactnumber 
    ON lin_people.id = contactnumber.person_id AND contactnumber.contact_type = 'Work Telephone' 

    LEFT JOIN lin_contacts AS contactmobile 
    ON lin_people.id = contactmobile.person_id AND contactmobile.contact_type = 'Mobile' 

    LEFT JOIN lin_contacts AS contactemail 
    ON lin_people.id = contactemail.person_id AND contactemail.contact_type = 'Email' 
WHERE lin_employee_attributes.begin_date = '2016-11-07' 
     OR lin_employee_attributes.end_date = '2017-10-21' 
GROUP BY lin_users.id, 
    lin_employee_attributes.unit_code, 
    lin_employee_attributes.position_code, 
    lin_employee_attributes.begin_date, 
    lin_employee_attributes.end_date, lin_people.id, 
    contactnumber.contact_id, 
    contactmobile.contact_id, 
    contactemail.contact_id; 
+0

이러한 원시 쿼리를 사용하는 것이 좋습니다. Laravel의 Eloquent는 쿼리 빌더이며 최적화 된 원시 쿼리만큼 효율적이지 않습니다. https://laravel.com/docs/5.4/database#running-queries – schellingerht

+0

쿼리를 사용해 보았지만 결과 : 'SQLSTATE [42P01] : 정의되지 않은 테이블 : 7 오류 : 릴레이션 '사용자'가 존재하지 않습니다. LINE 1 : id = $ 1 인 사용자로부터 선택 * ^ (SQL : select * from id = 1 사용자) ' 데이터베이스의 사용자 테이블이 있지만. –

답변

0

이 작품을 사용. 마지막으로, 위 쿼리는 개념 쿼리를 사용하여 laravel에서 쿼리 할 수 ​​있습니다.

$users = $this->db->getTable('users') 
      ->select('users.status_employee_id', 
        'users.id', 
        'users.username', 
        'users.email', 
        'users.created', 
        'users.modified', 
        'users.flag_delete', 
        'employee_attributes.unit_code', 
        'employee_attributes.position_code', 
        'employee_attributes.begin_date', 
        'employee_attributes.end_date', 
        'contactnumber.contact_id as phone_number', 
        'contactmobile.contact_id as cell_number', 
        'contactemail.contact_id as email' 
        ) 
      ->join('status_employees', 'users.status_employee_id', '=', 'status_employees.id') 
      ->join('people', 'status_employees.person_id', '=', 'people.id') 
      ->join('employee_attributes', 'users.status_employee_id', '=', 'employee_attributes.status_employee_id') 
      ->leftJoin('contacts AS contactnumber', function($join) 
        { 
         $join->on('people.id', '=', 'contactnumber.person_id'); 
         $join->on('contactnumber.contact_type','=', DB::raw("'Work Telephone'")); 
        }) 
      ->leftJoin('contacts AS contactmobile', function($join) 
        { 
          $join->on('people.id', '=', 'contactmobile.person_id'); 
          $join->on('contactmobile.contact_type','=', DB::raw("'Mobile'")); 
        }) 
       ->leftJoin('contacts AS contactemail', function($join) 
        { 
         $join->on('people.id', '=', 'contactemail.person_id'); 
         $join->on('contactemail.contact_type','=', DB::raw("'Email'")); 
        }) 

      ->where(function ($query) use ($begin_date, $end_date) { 
       $query->where('employee_attributes.begin_date', $begin_date) 
         ->orWhere('employee_attributes.end_date', $end_date); 
      }) 
      ->groupby('users.status_employee_id', 
         'users.id', 
         'users.username', 
         'users.email', 
         'users.created', 
         'users.modified', 
         'users.flag_delete', 
         'employee_attributes.unit_code', 
         'employee_attributes.position_code', 
         'employee_attributes.begin_date', 
         'employee_attributes.end_date', 
         'contactnumber.contact_id', 
         'contactmobile.contact_id', 
         'contactemail.contact_id' 
        ) 
      ->get(); 
0

이 시도 : 당신이 원하는대로

const TABLE = 'my_table_name'; 

return $this 
    ->select(
     self::TABLE . 'id as myidalias', 
     self::TABLE . 'username as myuseralias') 
    ->addSelect(DB::raw(
     " 
     (your custom select here) as mycustomresult 
     " 
    )); 

당신은 많은 addSelect을 추가 할 수 있습니다. 또한 이와 같은 복잡한 쿼리가 많은 경우 중복 된 부분이 많아서 scopes을 사용하는 것이 좋습니다. 이렇게하면 코드를 깨끗하고 재사용 할 수 있습니다.

public function scopeLeftJoinCategory($query) 
{ 
    return $query 
      ->leftJoin(Category::CONTENTS_CATEGORIES . ' AS cc', 'con.id', '=', 'cc.content_id') 
      ->leftJoin(Category::TABLE . ' AS cat', 'cc.category_id', '=', 'cat.id'); 
} 

그런 다음 당신은 다음과 같이 사용하면 ->leftJoinCategory()

+0

감사합니다. Zoltán Jére, 그것을 구현하려고합니다. 나는 그것이 문제를 해결할 수 있기를 바랍니다. –

+0

https://github.com/barryvdh/laravel-debugbar도 추가하는 것이 좋습니다 코드에 laravel이 무엇을 구축했는지에 대한 최종 쿼리를 볼 수 있습니다. 쿼리를 예상대로 작동하지 않으면 잘못된 부분을 찾는 데 도움이되는 수동으로 복사하고 실행할 수 있습니다. –

+0

위대한 도구 laravel-DebugBar, 프로젝트 laravel에 설치하려고합니다. –

관련 문제