• 企业400电话
  • 网络优化推广
  • AI电话机器人
  • 呼叫中心
  • 全 部 栏 目

    网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    laravel技巧之查询构造器Query Builder叠加链式调用的方法
    POST TIME:2021-10-18 05:16

    查询构造器简介

    Laravel查询构造器(query builder)提供方便、流畅的接口,用来建立及执行数据库查找语法

    使用PDO参数绑定,以保护应用程序免于SQL注入。因此传入的参数不需额外转义特殊字符

    基本可以满足所有的数据库操作,而且在所有支持的数据库系统上都可以执行

    引言

    今天给大家介绍一下laravel查询构造器的一个小技巧,在官方文档示例中没有详细提到,也不是啥高端技巧,可能很多人在用了,不知道的同学可以看看。

    在业务代码中经常会根据不同条件来查询,举个简单例子,我们现在要查询用户列表,按时间倒序排列,可能会有status和type作为限定条件。

    一开始我是这样写的

     if($status  $type) {
     $users = User::where('status', $status)->where('type', $type)->latest()->get();
     } else if ($status) {
     $users = User::where('status', $status)->latest()->get(); 
     } else if ($type) {
     $users = User::where('status', $type)->latest()->get();
     } else {
     $users = User::latest()->get(); 
     }

    这个代码真的很丑陋,很多公共代码,比如->latest()->get(),写了四遍,如果产品说今天我们要正序排列,那你得改四个地方。虽然借助编辑器改一下也很快,不过要知道这只是个最简单的例子。

    看了下文档有个when方法进行条件判断,一堆闭包也不是很理想。我坚信肯定有更优雅的写法,于是上stackoverflow搜了一波,果然万能的歪果仁给了我答案。

    改进后的写法:

     $query = User::query();
     // 如果用DB: $query = DB::table('user'); 
     if ($status) {
      $query->where('status', $status);
     }
     if ($type) {
      $query->where('type', $type);
     } 
     $users = $query->latest()->get();

    用变量保存查询构造器实例,然后在其上叠加约束条件,最后get集合。公共部分放在首尾,结构清晰,是不是高下立判啊?

    而且我们还可以把$query当成参数传入方法或函数中,将公共逻辑封装在一起,方便多处调用:

     function foo($query) {
      $query->with(['girl', 'gay'])
        ->latest()
        ->get();
     } 
     $query = User::query();
     $users = foo($query);

    这种写法有一个注意事项,一旦你在$query上调用where等约束方法,就会改变此query,有时候我们需要提前clone一个query。

    举例说明,比如我们同时要拿到type为1和2的users

     $query_1 = User::query();
     $query_2 = clone $query_1; 
     $users_1 = $query_1->where('type', 1)->latest()->get();
     $users_2 = $query_2->where('type', 2)->latest()->get();
     // 错误 $users_2 = $query_1->where('type', 1)->latest()->get();
     // 这样写得到得是type = 1 and $type = 2

    laravel的文档里虽然没有写这种示例,但是提了一下:

    你可以使用 DB facade 的 table 方法开始查询。这个 table 方法针对查询表返回一个查询构造器实例,允许你在查询时链式调用更多约束,并使用 get 方法获取最终结果

    题外话

    以前听一些老前辈说他们不要只会百度的程序员,当时感觉真装哔,不都是搜索引擎,因为我那时不用google。现在我也不愿意和只会百度的共事了,百度只是个广告搜索嘛,搜出来的都是些啥玩意。

    google、stackoverflow真是个好东西,很多歪果仁知识丰富,解答专业,从计算机历史到操作系统、数据库、各种编程语言,帮我de了好多bug。在segmentfault这么打广告是不是不好,溜了!

    总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

    Reference:

    1. How to create multiple where clause query using Laravel Eloquent? - stackoverflow
    2. Model::query - laravelAPI
    您可能感兴趣的文章:
    • Laravel框架DB facade数据库操作详解
    • Laravel5.7 数据库操作迁移的实现方法
    • PHP开发框架Laravel数据库操作方法总结
    • Laravel5中实现模糊匹配加多条件查询功能的方法
    • 使用Laravel中的查询构造器实现增删改查功能
    • 解决laravel查询构造器中的别名问题
    • Laravel 5框架学习之Eloquent (laravel 的ORM)
    • 详解PHP的Laravel框架中Eloquent对象关系映射使用
    • Laravel 5框架学习之Eloquent 关系
    • Laravel Eloquent ORM 实现查询表中指定的字段
    • Laravel5.7 Eloquent ORM快速入门详解
    • laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
    上一篇:PHP实现的栈数据结构示例【入栈、出栈、遍历栈】
    下一篇:php实现斐波那契数列代码分享
  • 相关文章
  • 

    关于我们 | 付款方式 | 荣誉资质 | 业务提交 | 代理合作


    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    X

    截屏,微信识别二维码

    微信号:veteran88

    (点击微信号复制,添加好友)

     打开微信