您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關ThinkPHP中搜索器的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
[√新技能] 搜索器——統(tǒng)一管理你的搜索代碼
模型搜索器是自模型獲取器和修改器功能之后的第三個統(tǒng)一管理的利器,主要用于封裝字段(或者搜索標識)的查詢條件表達式,一個搜索器對應一個特殊的方法(該方法必須是public類型),方法命名規(guī)范為:searchFieldNameAttr(FieldName為數(shù)據(jù)表字段的駝峰轉換),搜索器僅在調用withSearch方法的時候觸發(fā)。
搜索器的使用場景包括:
·限制和規(guī)范表單的搜索條件;
·預定義查詢條件簡化查詢。
例如,我們需要給User模型定義name字段和時間字段的搜索器,可以使用:
<?php namespace app\index\model; use think\Model; class User extends Model { public function searchNameAttr($query, $value, $data) { $query->where('name','like', $value . '%'); } public function searchCreateTimeAttr($query, $value, $data) { $query->whereBetweenTime('create_time', $value[0], $value[1]); } }
搜索器方法的參數(shù)有三個,第一個是查詢對象,第二個是當前搜索標識的值,第三個是當前所有的搜索數(shù)據(jù)(可選)。
然后,我們可以使用下面的查詢
User::withSearch(['name', 'create_time'], [ 'name'=>'think', 'create_time'=>['2018-8-1','2018-8-5'], 'status'=>1 ]) ->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'
可以看到查詢條件中并沒有status字段的數(shù)據(jù),因此可以很好的避免表單的非法查詢條件傳入,在這個示例中僅能使用name和create_time條件進行查詢。
事實上,除了在搜索器中使用查詢表達式外,還可以使用其它的任何查詢構造器以及鏈式操作。
例如,你需要通過表單定義的排序字段進行搜索結果的排序,可以使用
<?php namespace app\index\model; use think\Model; class User extends Model { public function searchNameAttr($query, $value, $data) { $query->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字段標識,但我們仍然使用的是name字段標識的搜索器(也就是searchNameAttr方法)。
搜索器通常會和查詢范圍進行比較,搜索器無論定義了多少,只需要一次調用,查詢范圍如果需要組合查詢的時候就需要多次調用。
如果你使用的是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();
關于“ThinkPHP中搜索器的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。