将SQL查询转换为Laravel?

时间:2014-07-16 18:46:34

标签: mysql sql laravel

我有一个非常大的查询,还有更多更大的查询。

我尝试将其转换为与Laravel的DB类一起使用,除非它没有返回任何内容。

有什么东西能自动完成吗?像转换器一样?

我在这里做错了什么?

SELECT 
cases.id
FROM cases 
LEFT JOIN cases_cstm ON cases.id = cases_cstm.id_c 
JOIN cases_contacts_1_c ON cases.id = cases_contacts_1_c.cases_contacts_1cases_ida AND cases_contacts_1_c.deleted = 0 
JOIN contacts ON cases_contacts_1_c.cases_contacts_1contacts_idb = contacts.id AND contacts.deleted = 0 
LEFT JOIN contacts_pal_policy_adviser_list_1_c ON contacts.id = contacts_pal_policy_adviser_list_1_c.contacts_pal_policy_adviser_list_1contacts_ida 
LEFT JOIN pal_policy_adviser_list ON contacts_pal_policy_adviser_list_1_c.contacts_pal_policy_adviser_list_1pal_policy_adviser_list_idb = pal_policy_adviser_list.id 
LEFT JOIN huge__insurance_carriers_cases_1_c ON cases.id = huge__insurance_carriers_cases_1_c.huge__insurance_carriers_cases_1cases_idb AND huge__insurance_carriers_cases_1_c.deleted = 0 
LEFT JOIN huge__insurance_carriers ON huge__insurance_carriers_cases_1_c.huge__insurance_carriers_cases_1huge__insurance_carriers_ida = huge__insurance_carriers.id AND huge__insurance_carriers.deleted = 0 
LEFT JOIN products_cases_1_c ON cases.id = products_cases_1_c.products_cases_1cases_idb 
LEFT JOIN products ON products_cases_1_c.products_cases_1products_ida = products.id 
WHERE cases.deleted = 0 
AND contacts.id = 'b8a00721-40f1-7801-b4b9-50ce152ce2ec' 
AND ((cases.status = 'Entered') or (cases.status = 'Submitted') or (cases.status = 'Approved') or (cases.status = 'Issued') or (cases.status = 'Gathering_Medical_Information') or (cases.status = 'Awaiting_Carrier_Offers') or (cases.status = 'All_Offers_In') or (cases.status = 'Informal_Entered') or (cases.status = 'Await_Del_Req')) GROUP BY cases.id ORDER BY cases_cstm.insured_name_c ASC LIMIT 0, 20

Laravel查询

DB::table('cases')
        ->leftJoin('cases_cstm', 'cases.id', '=', 'cases_cstm.id_c')
        ->join('cases_contacts_1_c', 'cases.id', '=', 'cases_contacts_1_c.cases_contacts_1cases_ida')
        ->join('contacts', 'cases_contacts_1_c.cases_contacts_1contacts_idb', '=', 'contacts.id')
        ->leftJoin('contacts_pal_policy_adviser_list_1_c', 'contacts.id', '=', 'contacts_pal_policy_adviser_list_1_c.contacts_pal_policy_adviser_list_1contacts_ida')
        ->leftJoin('pal_policy_adviser_list', 'contacts_pal_policy_adviser_list_1_c.contacts_pal_policy_adviser_list_1pal_policy_adviser_list_idb', '=', 'pal_policy_adviser_list.id')
        ->leftJoin('huge__insurance_carriers_cases_1_c', 'cases.id', '=', 'huge__insurance_carriers_cases_1_c.huge__insurance_carriers_cases_1cases_idb')
        ->leftJoin('huge__insurance_carriers', 'huge__insurance_carriers_cases_1_c.huge__insurance_carriers_cases_1huge__insurance_carriers_ida', '=', 'huge__insurance_carriers.id')
        ->leftJoin('products_cases_1_c', 'cases.id', '=', 'products_cases_1_c.products_cases_1cases_idb')
        ->leftJoin('products', 'products_cases_1_c.products_cases_1products_ida', '=', 'products.id')
        ->where('contacts.id', '=', 'b8a00721-40f1-7801-b4b9-50ce152ce2ec')
        ->orWhere('cases.status', '=', 'Entered')
        ->orWhere('cases.status', '=', 'Submitted')
        ->orWhere('cases.status', '=', 'Approved')
        ->orWhere('cases.status', '=', 'Issued')
        ->orWhere('cases.status', '=', 'Gathering_Medical_Information')
        ->orWhere('cases.status', '=', 'Awaiting_Carrier_Offers')
        ->orWhere('cases.status', '=', 'All_Offers_In')
        ->orWhere('cases.status', '=', 'Informal_Entered')
        ->orWhere('cases.status', '=', 'Await_Del_Req');
        ->get();

1 个答案:

答案 0 :(得分:0)

$statuses = [...]; // array of statuses to compare

DB::table('cases')
  // all your joins
  ->where('contacts.id', '=', 'b8a00721-40f1-7801-b4b9-50ce152ce2ec')
  ->whereIn(cases.status', $statuses)
  ->get(['cases.id']);

或(真的,不要,只是作为一个例子):

DB::table('cases')
  // all your joins
  ->where('contacts.id', '=', 'b8a00721-40f1-7801-b4b9-50ce152ce2ec')
  ->where(function($q) { // this will wrap all those OR WHERE clauses in AND ( .. )
     $q->where(...)
       // all the orWheres
       ->orWhere(...);
  })
  ->get(['cases.id']);

此外,在此之后使用DB::getQueryLog()来获取由Laravel运行的查询数组。