欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

mysql 查詢 問(wèn)號(hào),like函數(shù)的用法

mysql 查詢 問(wèn)號(hào),like函數(shù)的用法?

引言

本文接著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)注。