引言
本文接著laravel的功能講解,說一說在模型中查詢條件內,使用like這樣的SQL關鍵字 進行子字符串匹配。并通過幾個示例,和不同的實現方法,為大家展示laravel的靈活性。
學習時間
比如有一個模型,存儲的是用戶的訂閱數據。現在根據傳入的參數,要篩選出某個電子郵件關聯的所有訂閱記錄, 或者根據用戶姓名關鍵字關聯的所有訂閱記錄,代碼如下:
BookingDates::where('email', Input::get('email'))->orWhere('name', 'like', '%' . Input::get('name') . '%')->get();
上面代碼生成的SQL大約是下面這樣的:
select * from booking_dates where email='my@email.com' or name like '%John%'
這樣的做法固然是可以的,但是我們知道包含 like 關鍵字的SQL語句是肯定命中不了數據庫索引的。所以一般我們都要避免這種操作。 如果實在不行,在可讀性上,我們可以嘗試一下laravel提供的本地作用域功能, 在模型內,或者全局內創建一個查詢方法。
public function scopeWhereLike($query, $column, $value) { return $query->where($column, 'like', '%'.$value.'%'); }
這個是組成and SQL語句的方式,當然還有or SQL語句。
public function scopeOrWhereLike($query, $column, $value) { return $query->orWhere($column, 'like', '%'.$value.'%'); }
這樣上面的查詢語句就可以改造成這樣:
$result = BookingDates::whereLike('email', $email)->orWhereLike('name', $name)->get();
把查詢語句單獨拿出來封裝為公用的方法,使程序更加簡潔易用。
當然了,如果傾向于使用原生的SQL語句實現,在模型的查詢方法上可以像下面這樣寫:
BookingDates::whereRaw('email = ? or name like ?', [$request->email,"%{$request->name}%"])->get();
特別注意的是laravel的參數綁定是使用問號的。
最后再說一個知識點,就是MySQL內置的關鍵字,除了like匹配之外,我們還可以使用內置字符串函數instr進行判斷。 那么還是使用原生的查詢方式,代碼如下:
BookingDates::whereRaw('email = ? or instr(name, ?) > 0', [$request->email,"%{$request->name}%"])->get();
寫在最后
本文講的知識點比較小,就是手動組裝MySQL的查詢語句。我們應該盡量避免MySQL的字符串匹配和操作, 這一部分會給查詢過程帶來性能的損耗。
Happy coding :-)
我是@程序員小助手,持續分享編程知識,歡迎關注。