1. 前景題要:
在一個專案中,我遇到了需要聯表查詢的情況,同時聯表之后需要通過一個關鍵詞來篩選出對應的資料,就比如我這里需要對角色名字、用戶名稱、電話這幾個欄位,通過傳入的一個keyword欄位進行篩選,
2. 問題分析:
此時我需要把用戶表聯系上我們的訂單表,訂單表中有user_id的欄位,從而可以得到訂單的用戶名稱,這里首先講一下join(聯表)的用法,
常用的有三種join()、leftJoin()、rightJoin(),分別是內連接、左連接、右連接.
內連接:在兩張表進行連接查詢時,只保留兩張表中完全匹配的結果集,即兩張表的交集,
左連接:在兩張表進行連接查詢時,會回傳左表所有的行,即使在右表中沒有匹配的記錄,即左表中存在的資料對應在右表中不存在,依舊會回傳左表中的資料,
右連接:在兩張表進行連接查詢時,會回傳右表所有的行,即使在左表中沒有匹配的記錄,與左連接恰好相反,
接著需要寫查詢的條件陳述句,我們首先 第一步需要查詢有效的訂單,其次第二步才是根據傳入的keyword進行篩選,此處在最開始的情況下我是直接使用where和orWhere混合進行查詢,但遇到了總是會有些查詢條件未被包含進去,此處我查了相關資料才弄明白,我們此處可以將利用keyword篩選的查詢寫成一個閉包,從而不與其他where陳述句產生相互的影響,
3. 解決方案:
注:orWhere如果不用閉包的形式寫很容易寫成分開的查詢條件
$order_res = Order::leftJoin('user', 'order.user_id', '=', 'user.id')->select('order.*', 'user.title')//此處只是將有用的資訊選擇在聯表中,
->where('state', '=', 1) //首先就是將有效的訂單篩選出來,
->where(function($query) use ($keyword){//再在此閉包中根據keyword關鍵詞來進行篩選,
$query->where('order.mobile', 'like', '%'.$keyword.'%')
->orWhere('user.title', 'like', "%{$keyword}%")//此處用了兩個orWhere查詢,都是or的關系,會將三種條件任意一個滿足的資料篩選出來,
->orWhere('order.character_title', 'like', "%{$keyword}%");
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/241906.html
標籤:其他
上一篇:JAVA 自定義連接池
