ThinkPHP中搜索器的示例分析
创始人
2024-11-25 21:40:32
0次

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

模型搜索器是自模型获取器和修改器功能之后的第三个统一管理的利器,主要用于封装字段(或者搜索标识)的查询条件表达式,一个搜索器对应一个特殊的方法(该方法必须是public类型),方法命名规范为:searchFieldNameAttr(FieldName为数据表字段的驼峰转换),搜索器仅在调用withSearch方法的时候触发。

搜索器的使用场景包括:

   ·限制和规范表单的搜索条件;

   ·预定义查询条件简化查询。

例如,我们需要给User模型定义name字段和时间字段的搜索器,可以使用:

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条件进行查询。

事实上,除了在搜索器中使用查询表达式外,还可以使用其它的任何查询构造器以及链式操作。

例如,你需要通过表单定义的排序字段进行搜索结果的排序,可以使用

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();

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...