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