ThinkPHP:模型三大利器之一(搜索器)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了ThinkPHP:模型三大利器之一(搜索器),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3144字,纯文字阅读大概需要5分钟。
内容图文
[√新技能] 搜索器——统一管理你的搜索代码
模型搜索器是自模型获取器和修改器功能之后的第三个统一管理的利器,主要用于封装字段(或者搜索标识)的查询条件表达式,一个搜索器对应一个特殊的方法(该方法必须是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();
PHP中文网,有大量免费的ThinkPHP入门教程,欢迎大家学习!
本文转自:https://blog.thinkphp.cn/783775
以上就是ThinkPHP:模型三大利器之一(搜索器)的详细内容。
内容总结
以上是互联网集市为您收集整理的ThinkPHP:模型三大利器之一(搜索器)全部内容,希望文章能够帮你解决ThinkPHP:模型三大利器之一(搜索器)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。