這篇文章將為大家詳細(xì)講解有關(guān)ThinkPHP中搜索器的示例分析,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到紅河網(wǎng)站設(shè)計(jì)與紅河網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都做網(wǎng)站、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊(cè)、網(wǎng)頁(yè)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋紅河地區(qū)。[√新技能] 搜索器——統(tǒng)一管理你的搜索代碼
模型搜索器是自模型獲取器和修改器功能之后的第三個(gè)統(tǒng)一管理的利器,主要用于封裝字段(或者搜索標(biāo)識(shí))的查詢條件表達(dá)式,一個(gè)搜索器對(duì)應(yīng)一個(gè)特殊的方法(該方法必須是public類型),方法命名規(guī)范為:searchFieldNameAttr(FieldName為數(shù)據(jù)表字段的駝峰轉(zhuǎn)換),搜索器僅在調(diào)用withSearch方法的時(shí)候觸發(fā)。
搜索器的使用場(chǎng)景包括:
·限制和規(guī)范表單的搜索條件;
·預(yù)定義查詢條件簡(jiǎn)化查詢。
例如,我們需要給User模型定義name字段和時(shí)間字段的搜索器,可以使用:
where('name','like', $value . '%'); } public function searchCreateTimeAttr($query, $value, $data) { $query->whereBetweenTime('create_time', $value[0], $value[1]); } }
搜索器方法的參數(shù)有三個(gè),第一個(gè)是查詢對(duì)象,第二個(gè)是當(dāng)前搜索標(biāo)識(shí)的值,第三個(gè)是當(dāng)前所有的搜索數(shù)據(jù)(可選)。
然后,我們可以使用下面的查詢
User::withSearch(['name', 'create_time'], [ 'name'=>'think', 'create_time'=>['2018-8-1','2018-8-5'], 'status'=>1 ]) ->select();
最終生成的SQL語(yǔ)句類似于
SELECT * FROM `think_user` WHERE `name` LIKE 'think%' AND `create_time` BETWEEN '2018-08-01 00:00:00' AND '2018-08-05 00:00:00'
可以看到查詢條件中并沒(méi)有status字段的數(shù)據(jù),因此可以很好的避免表單的非法查詢條件傳入,在這個(gè)示例中僅能使用name和create_time條件進(jìn)行查詢。
事實(shí)上,除了在搜索器中使用查詢表達(dá)式外,還可以使用其它的任何查詢構(gòu)造器以及鏈?zhǔn)讲僮鳌?/p>
例如,你需要通過(guò)表單定義的排序字段進(jìn)行搜索結(jié)果的排序,可以使用
where('name','like', $value . '%'); if (isset($data['sort'])) { $query->order($data['sort']); } } public function searchCreateTimeAttr($query, $value, $data) { $query->whereBetweenTime('create_time', $value[0], $value[1]); } }
然后,我們可以使用下面的查詢
User::withSearch(['name','create_time', 'status'], [ 'name'=>'think', 'create_time'=>['2018-8-1','2018-8-5'], 'status'=>1, 'sort'=>['status'=>'desc'], ]) ->select();
最終查詢的SQL可能是
SELECT * FROM `think_user` WHERE `name` LIKE 'think%' AND `create_time` BETWEEN '2018-08-01 00:00:00' AND '2018-08-05 00:00:00' ORDER BY `status` DESC
你還可以給搜索器定義字段別名,例如:
User::withSearch(['name' => 'nickname','create_time', 'status'], [ 'nickname'=>'think', 'create_time'=>['2018-8-1','2018-8-5'], 'status'=>1, 'sort'=>['status'=>'desc'], ]) ->select();
搜索的數(shù)據(jù)使用的是nickname字段標(biāo)識(shí),但我們?nèi)匀皇褂玫氖莕ame字段標(biāo)識(shí)的搜索器(也就是searchNameAttr方法)。
搜索器通常會(huì)和查詢范圍進(jìn)行比較,搜索器無(wú)論定義了多少,只需要一次調(diào)用,查詢范圍如果需要組合查詢的時(shí)候就需要多次調(diào)用。
如果你使用的是Db查詢方法,仍然可以使用搜索器功能,只是搜索器方法定義需要改成閉包方式,如下:
User::withSearch(['name' => function($query,$value,$data){ $query->where('name','like', $value . '%'); }, 'create_time'=>function($query,$value,$data){ $query->whereBetweenTime('create_time', $value[0], $value[1]); }], [ 'name'=>'think', 'create_time'=>['2018-8-1','2018-8-5'], 'status'=>1 ]) ->select();
關(guān)于“ThinkPHP中搜索器的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。