mysql - 将 SQL 查询转换为 Laravel?

标签 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();

最佳答案

$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 运行的查询数组。

关于mysql - 将 SQL 查询转换为 Laravel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24788383/

相关文章:

mysql - 如何更新一个有大量更新的表,同时保持表对大量用户的可用性?

php - 获取每个帖子的评论

mysql - 在字符串中查找表的数据

mysql - 如何将多个详细信息行的列汇总到单个列中?

MySQL RAND() 不工作

sql - 从 Analysis Services 获取实例名称,如 @@ServerName

mysql - 重置/压缩mysql AI ID字段?

php - 当单台机器上的多个 Laravel 项目或 Laravel 不读取 .env 文件时冲突数据库

Laravel - 记录 Guzzle 请求文件

php - 拉维尔 5 : Type-hinting a FormRequest class inside a controller that extends from BaseController