溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ThinkPHP中搜索器的示例分析

發(fā)布時間:2021-06-04 14:25:38 來源:億速云 閱讀:229 作者:小新 欄目:編程語言

這篇文章將為大家詳細講解有關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中搜索器的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI