ThinkPHP:模型三大利器之一(搜索器)

ThinkPHP:模型三大利器之一(搜索器)

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

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

搜索器的使用场景包括:

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

立即学习“PHP免费学习笔记(深入)”;

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

例如,我们需要给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条件进行查询。

纳米搜索 纳米搜索

纳米搜索:360推出的新一代AI搜索引擎

纳米搜索 30 查看详情 纳米搜索

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

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

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:模型三大利器之一(搜索器)的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/235795.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
我们如何通过从基表中选择某些范围的值来创建 MySQL 视图?
上一篇 2026年10月4日 01:16:13
Golang如何应用享元模式_Golang 享元模式实现实践
下一篇 2025年12月16日 18:47:07

相关推荐

  • ThinkPHP:模型三大利器之二(修改器)

    ThinkPHP:模型三大利器之二(修改器)ThinkPHP:模型三大利器之二(修改器)ThinkPHP:模型三大利器之二(修改器)ThinkPHP:模型三大利器之二(修改器)

    修改器是模型的三大利「器」之一,本篇我们来总结下修改器的用法,以及一些注意事项。 定义修改器 修改器的作用是在模型对象数据写入数据库之前进行一些必要的数据处理,修改器的标准定义如下: public function setFieldNameAttr($value, $data){ // 对value…

    2026年10月4日 • 用户投稿
    500
  • ThinkPHP:模型三大利器之三(获取器)

    ThinkPHP:模型三大利器之三(获取器)ThinkPHP:模型三大利器之三(获取器)ThinkPHP:模型三大利器之三(获取器)ThinkPHP:模型三大利器之三(获取器)

    定义获取器 获取器的作用是对模型对象的(原始)数据做出自动处理。一个获取器对应模型的一个特殊方法(该方法必须为public类型),方法命名规范为: getFieldNameAttr FieldName为数据表字段的驼峰转换或者你数据表不存在的字段(注意理解后面这句话),下面是一个典型的获取器定义: …

    2026年10月4日 • 用户投稿
    100
  • 如何在ThinkPHP6中使用Repository模式

    随着web应用程序的复杂性增加,我们需要更好的组织代码来提高可维护性和可扩展性。repository模式是一个非常流行的设计模式,它可以在模型层和持久层之间提供一个中间层,用于处理数据的读写操作。在本文中,我们将探讨如何在thinkphp6中使用repository模式来提高代码质量。 什么是Rep…

    用户投稿 2026年10月3日
    100
  • 优化PHP框架的性能表现_通过ThinkPHP实现php框架怎么用的调优

    启用生产模式、配置与路由缓存、优化数据库查询、合理使用页面缓存是提升ThinkPHP性能的关键。通过关闭调试模式、生成配置缓存文件、设置数据库索引与查询缓存、开启模板及页面缓存,可显著降低资源消耗、加快响应速度,实现高效稳定的Web应用运行。 提升PHP框架的性能,关键在于减少资源消耗、加快响应速度…

    2026年10月2日
    500
  • ThinkPHP中d()和m()的区别是什么

    ThinkPHP中d()和m()的区别是什么ThinkPHP中d()和m()的区别是什么ThinkPHP中d()和m()的区别是什么ThinkPHP中d()和m()的区别是什么

    区别:M方法用于高效实例化一个基础模型类;而D方法用于实例化一个用户定义模型类。M方法不需要创建模型类文件,M方法不会读取模型类;而D方法必须要创建模型类。 本教程操作环境:windows7系统、thinkphp6版、Dell G3电脑。 M方法和D方法的区别 ThinkPHP 中M方法和D方法都用…

    2026年10月2日 • 用户投稿
    000
  • 来聊聊基于ThinkPHP开发的好处

    来聊聊基于ThinkPHP开发的好处来聊聊基于ThinkPHP开发的好处来聊聊基于ThinkPHP开发的好处来聊聊基于ThinkPHP开发的好处

    下面由thinkphp框架教程栏目给大家介绍基于thinkphp开发的好处,希望对需要的朋友有所帮助! 很多程序员都喜欢比框架,又是性能,又是逼格。说实在,对于小企业,TP 肯定比较实用,全中文的文档,还好招人。有人会扯性能什么的,全中国有几个大厂?大部分都是并发需求不超过 20 的小微企业,很多都…

    2026年10月2日 • 用户投稿
    000
  • 分享推荐一款好用的TP富文本编辑器-CKEditor

    分享推荐一款好用的TP富文本编辑器-CKEditor分享推荐一款好用的TP富文本编辑器-CKEditor分享推荐一款好用的TP富文本编辑器-CKEditor分享推荐一款好用的TP富文本编辑器-CKEditor

    本篇文章给大家推荐一款炒鸡好用的thinkphp富文本编辑器–ckeditor,下面给大家介绍一下使用ckeditor的方法,希望对大家有所帮助! 最近一直在做Thinkphp后端开发,之前都是使用layui的富文本编辑器,layui的优点是简单易用,但缺点也比较明显,就是编辑器功能比较…

    2026年10月2日 • 用户投稿
    100
  • 简单聊聊Thinkphp中的URL路径

    下面thinkphp框架教程栏目将给大家简析thinkphp中的url路径,希望对需要的朋友有所帮助! Thinkphp关于URL路径 假如你项目首页的URL是:www.test.com/other/Form 假如当前模块是:Index 假如当前操作是:index 立即学习“PHP免费学习笔记(深入…

    2026年10月2日
    100
  • thinkphp中m方法与d方法的区别是什么

    thinkphp中m方法与d方法的区别是什么thinkphp中m方法与d方法的区别是什么thinkphp中m方法与d方法的区别是什么thinkphp中m方法与d方法的区别是什么

    thinkphp中m方法与d方法的区别:1、m方法不需要创建模型类文件,而d方法必须有创建模型类;2、d方法会实例化具体的模型类,m方法实例化不需要加载具体的模型类。 本文操作环境:Windows10系统、thinkphp v5.1版、Dell G3电脑。 thinkphp中m方法与d方法的区别是什…

    2026年10月1日 • 用户投稿
    100
  • thinkphp框架有什么优缺点

    thinkphp框架有什么优缺点thinkphp框架有什么优缺点thinkphp框架有什么优缺点thinkphp框架有什么优缺点

    thinkphp框架的优点:1、易于上手,有丰富的中文文档;2、学习成本低,社区活跃度高;3、框架的兼容性较强;4、适合用于中小项目的开发。缺点:1、对Ajax的支持不是很好;2、目录结构混乱,需要花时间整理;3、上手容易,但深入学习较难。 本教程操作环境:Windows7系统、thinkphp v…

    2026年10月1日 • 用户投稿
    100
  • thinkphp的开发工具有哪些

    thinkphp的开发工具有哪些thinkphp的开发工具有哪些thinkphp的开发工具有哪些thinkphp的开发工具有哪些

    thinkphp的开发工具有:1、PHPStorm,一款功能强劲的PHP IDE;2、Eclipse,跨平台开源集成开发环境;3、Zend Studio;4、Sublime Text 3;5、PHP Designer;6、VSCode等等。 本教程操作环境:Windows7系统、thinkphp v…

    2026年10月1日 • 用户投稿
    200
  • thinkphp路由是什么

    thinkphp路由是什么thinkphp路由是什么thinkphp路由是什么thinkphp路由是什么

    在thinkphp中,路由是指根据url, 分配到对应的处理程序的映射;其作用是简化URL访问地址,并根据定义的路由类型做出正确的解析。简单来说,路由就是一个路径的解析,根据客户端提交的路径,将请求解析到相应的模块或控制器或方法上。 本教程操作环境:Windows7系统、thinkphp v5.1版…

    2026年10月1日 • 用户投稿
    000
  • 在ThinkPHP6中实现单元测试的最佳实践

    在thinkphp6中实现单元测试的最佳实践 随着现代软件开发中的快速迭代和高效交付的要求,单元测试已经成为一种不可或缺的自动化测试方法。在PHP语言中,单元测试框架的流行使得开发者不必再手动测试每个函数和方法,而是可以编写测试用例自动化地检查代码的正确性。在ThinkPHP6中,PHPUnit单元…

    用户投稿 2026年10月1日
    000
  • ci框架和thinkphp有什么区别

    ci框架和thinkphp有什么区别ci框架和thinkphp有什么区别ci框架和thinkphp有什么区别ci框架和thinkphp有什么区别

    区别:1、CI没有强制绑定模板对数据库的操作,而ThinkPHP有;2、ThinkPHP讲究使用的便利性,提供了很多函数助手,而CI的使用比较麻烦冗长;3、CI的视图文件不可配置,而TP的视图文件可配置。4、TP提供多种调试方法,CI没有。 本教程操作环境:Windows7系统、thinkphp v…

    2026年10月1日 • 用户投稿
    000
  • 聊聊TP在app接口开发过程中的安全验证问题

    下面thinkphp框架教程栏目将给大家介绍关于thinkphp在app接口开发过程中的通讯安全认证问题,希望对需要的朋友有所帮助! 对于我们写好的接口,如果不经过安全认证就可以直接访问的话,则将对我们网站产生非常大的安全隐患,一些hack可能直接用你的接口去操作数据库,后果无法估量。 那么如何才能…

    2026年10月1日
    200
  • 利用ThinkPHP6实现Cookie控制

    随着web应用的不断普及,cookie的使用也变得越来越重要。cookie是一种在客户端存储数据的技术,可以保存一些信息,如用户的登录状态、购物车信息等。 在本文中,我们将介绍如何使用 ThinkPHP6 实现 Cookie 控制,以实现用户登录状态的管理。 一、什么是Cookie? HTTP协议是…

    用户投稿 2026年10月1日
    100
  • TP框架V6.0.10LTS已发布(兼容PHP8.1)

    thinkphp v6.0.10版本主要添加了php8.1的兼容支持,以及thinkorm的一些改进,并宣布成为thinkphp历史上第二个lts版本,借此辞旧迎新之际,祝大家新年快乐! 6.0LTS版本核心不再做功能更新,仅作优化及BUG修复,BUG修复时间和安全更新均延长至2024年10月24日…

    2026年10月1日
    000
  • 聊聊有关thinkphp中的Image操作

    下面thinkphp框架教程栏目将给大家介绍关于thinkphp3.2.3中的image操作,希望对需要的朋友有所帮助! 独立thinkphp3.2.3中Image操作 参考thinkphp3.2.3中Image操作https://www.kancloud.cn/manual/thinkphp/18…

    2026年10月1日
    000
  • Thinkphp如何快速实现404跳转页

    下面thinkphp框架教程栏目将给大家介绍关于thinkphp制作404跳转页的方法,希望对需要的朋友有所帮助! Thinkphp制作404跳转页 网上有很多thinkphp的404页面制作方法,但大多太过繁琐不简便,很烦人,所以为大家分享了最便捷的404制作方法,如下。 在thinkphp的公共…

    2026年10月1日
    100
  • thinkphp用什么编辑器

    thinkphp用什么编辑器thinkphp用什么编辑器thinkphp用什么编辑器thinkphp用什么编辑器

    thinkphp可用的编辑器有:1、PHPStorm;2、Visual Studio Code;3、Eclipse;4、Zend Studio;5、Sublime Text;6、PHP Designer;7、NetBeans等。 本教程操作环境:Windows7系统、thinkphp v5.1版、D…

    2026年10月1日 • 用户投稿
    200

发表回复

登录后才能评论
关注微信