旗下导航:搜·么
当前位置:网站首页 > PHP框架 > ThinkPHP > 正文

ThinkPHP:模子三大利器之一(搜索器)【ThinkPHP教程】,ThinkPHP,模型,搜索器

作者:搜搜PHP网发布时间:2019-12-17分类:ThinkPHP浏览:86


导读:[√新技能]搜刮器——统一管理你的搜刮代码模子搜刮器是自模子猎取器和修改器功用以后的第三个统一管理的利器,重要用于封装字段(或许搜刮标识)的查询前提表达式,一个搜刮器...

[√新技能] 搜刮器——统一管理你的搜刮代码

模子搜刮器是自模子猎取器和修改器功用以后的第三个统一管理的利器,重要用于封装字段(或许搜刮标识)的查询前提表达式,一个搜刮器对应一个特别的要领(该要领必需是public范例),要领定名范例为:searchFieldNameAttr(FieldName为数据表字段的驼峰转换),搜刮器仅在挪用withSearch要领的时刻触发。

搜刮器的运用场景包含:

·限定和范例表单的搜刮前提;

·预定义查询前提简化查询。

比方,我们须要给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]);
    }    
}

搜刮器要领的参数有三个,第一个是查询对象,第二个是当前搜刮标识的值,第三个是当前一切的搜刮数据(可选)。

然后,我们能够运用下面的查询

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字段的数据,因而能够很好的防止表单的不法查询前提传入,在这个示例中仅能运用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();

搜刮的数据运用的是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();

ki4网,有大批免费的ThinkPHP入门教程,迎接人人进修!

本文转自:https://blog.thinkki4.cn/783775

以上就是ThinkPHP:模子三大利器之一(搜刮器)的细致内容,更多请关注ki4网别的相干文章!

标签:ThinkPHP模型搜索器