当前位置:首页 > 编程教程 > php技术文章 > laravel技巧之查询构造器Query Builder叠加链式调用的方法

laravel查询构造器Query Builder叠加链式调用方法示例代码

  • 发布时间:
  • 作者:码农之家
  • 点击:125

这篇文章主要知识点是关于laravel、查询构造器、Query、Builder、的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

跟兄弟连学PHP
跟兄弟连学PHP全书影印版
  • 类型:PHP自学大小:302.8 MB格式:PDF作者:兄弟连IT教育
立即下载

laravel技巧之查询构造器Query Builder叠加链式调用的方法

查询构造器简介

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

以上就是本次给大家分享的关于java的全部知识点内容总结,大家还可以在下方相关文章里找到相关文章进一步学习,感谢大家的阅读和支持。

PHP 相关电子书
学习笔记
网友NO.118553

使用Laravel中的查询构造器实现增删改查功能

引言 上一篇介绍了如何在windows环境下跑一个 laravel 项目,这一篇写如何使用 laravel 中的 查询构造器 实现增删改查。 读这篇文章时我默认你已拥有如下知识: 了解php的基础语法 了解数据库设计 了解常用的sql查询 正文 实现增删改查前, 我们先准备一些步骤: php, nginx, mysql 服务正确启用 新建一个数据库及其数据表 开启服务我们打开上篇文章介绍的 Wnmp.exe - Start all 然后cmd上键入命令: D:/wnmp/Wnmp/php/php-cgi.exe -b 127.0.0.1:9000 -c D:/wnmp/Wnmp/php/php.ini 新建一个数据库, 我命名为 shop , 然后新建两张表 分别: goods - 商品表 user - 用户表 数据表新建完成后, 我往里面随意插入了几条数据, 下图: 准备步骤已经完成, 我们打开上篇文章介绍的 testLaravel 项目 查看Laravel文档能够知道 数据库配置 在 config/database.php 里, 因为我们是mysql数据库, 所以找到对应的mysql选项: 查看 database……

网友NO.480790

Laravel框架查询构造器简单示例

本文实例讲述了Laravel框架查询构造器。分享给大家供大家参考,具体如下: public function query(){ //新增数据 //$bool = DB::table('wd_user')-insert(['username'='jack']); //dd($bool); //新增数据并且获取到自增id //$id = DB::table('wd_user')-insertGetid(['username'='Tom']); //dd($id); //新增多条数据 //$bool = DB::table('wd_user')-insert([['username'='a'],['username'='d']]); //dd($bool); //更新数据 //$bool = DB::table('wd_user')-where('uid',7)-update(['username'='tom']); //dd($bool); //自增 //$bool = DB::table('wd_user')-increment('age',1); //自减 //$bool = DB::table('wd_user')-decrement('age',1); //自减并且更新数据 //$bool = DB::table('wd_user')-decrement('age',1,['name'='imooc']); //删除数据 //$bool = DB::table('wd_user')-where('uid','=',7)-delete(); //dd($bool); //清空表 //DB::table('wd_user')-truncate(); //获取数据 //$user = DB::table('wd_user')-get(); //dd($user); //数据排序 //$user = DB::table('wd_user')-o……

<
1
>

Copyright 2018-2020 www.xz577.com 码农之家

版权投诉 / 书籍推广 / 赞助:520161757@qq.com