2017-03-03 7 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エラー:リレーションシップ" users "は存在しません LINE 1:id = $ 1のユーザーからの選択* ^(SQLの場合、id = 1のユーザーから選択) ' データベースのユーザーテーブルがあります。 –

答えて

0

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'); 
} 

それからちょうどこのようにそれを使用しています。最後に、上記のクエリーは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を使用することを強くお勧めします。コードをきれいにして再利用できます。この作品を使用して->leftJoinCategory()

+0

ありがとうZoltánJére、私はそれを実装しようとします。私はそれが問題を解決できることを願っています。 –

+0

https://github.com/barryvdh/laravel-debugbarを追加することもお勧めします 最終的なクエリを見ることができます。どのようなlaravelがあなたのコードに組み込まれていますか?手動でコピーして実行することができます。これは、クエリーが期待どおりに機能しない場合、間違った部分を見つけるのに役立ちます。 –

+0

素晴らしいツールlaravel-DebugBar、私はプロジェクトlaravelにインストールしようとしています。 –

関連する問題