引言

使用框架就是为了方便把注意力集中在逻辑上,而不用关心与数据库操作的方方面面。Laravel提供的 eloquent orm 使用面向对象的方式封装了PDO数据库操作,使用起来非常方便,对于复杂的SQL操作也游刃有余。

今天说一说,复杂的超多的WHERE子句,怎么写起来较为优雅。

学习时间

比如对于业务逻辑中,User模型在筛选查询的时候有非常多的限制条件,类似下面这样的:

这一堆令人头皮发麻的where,还不算变态。更厉害的是加上多表联合查询,那就真的是 sql 的噩梦了。然而对于laravel而言,这些全过程都可以拼装,你只需要关注筛选和操作,剩下的组装sql的过程,laravel都帮你做好了。

首先,你完全不必把每个条件都使用where链式调用,可以把查询条件放在一个 array 数组内,整体传入where子句。

这样把拼装where子句的工作,提前到查询数组的操作上,就更加灵活了。

比如说,and 查询条件的连接问题不大,最头疼的是加上 or 查询,就要顾着个顾那个,到处受限制。一般我们这样处理。比如声明 and 连接的查询条件数组:

$matchThese = ['field' => 'value', 'another_field' => 'another_value', ...];

使用 or 操作的另外一个查询条件数组:

$orThose = ['yet_another_field' => 'yet_another_value', ...];

然后把这些筛选条件重复利用:

$results = User::where($matchThese)->get();

或者是这样查询:

$results = User::where($matchThese)->orWhere($orThose)->get();

上面这条查询组装为SQL之后,长这样:

SELECT * FROM users WHERE (field = value AND another_field = another_value AND ...) OR (yet_another_field = yet_another_value AND ...)

优雅的SQL

laravel号称最优雅的PHP框架,不是浪得虚名,其设计的编程方式,可有效令人产生编程愉悦感。

就拿这个 model 的查询说起,你可以 "查询作用域”这么个时髦的功能,有效分散和重用查询条件。

拿“全局作用域”来说,它可以给模型的查询都添加上约束。Laravel 的软删除功能就是利用此特性从数据库中获取 “未删除”的模型。

你可以编写你自己的全局作用域,很简单、方便的为每个模型查询都加上约束条件。看官方给出的示例:

要将全局作用域分配给模型,需要重写模型的 booted 方法并使用 addGlobalScope 方法:

那么使用 User::all() 方法构造查询时,生成的sql语句中会追加 AgeScope 设置的查询约束条件:

select * from `users` where `age` > 200 

实现本地作用域SQL

学习了全局作用域,那么本地作用域就更好理解了。就是在对应的 Eloquent 模型方法前添加 scope 前缀,在模型中构造如下的作用域方法:

调用的使用选用就可以了:

$users = User::active()->that()->get();

写在最后

为了代码能够最大程度的复用,laravel也是很拼了。就这个本地作用域,我给五颗星。连SQL拼接都这么方便,这是其他框架里不曾有过的愉悦。

Happy coding :-)

我是 @程序员小助手 ,持续分享编程知识,欢迎关注。

拼装sql_3分钟短文 | Laravel复杂SQL超多WHERE子句,本地作用域你没用过相关推荐

  1. 拼装sql_2020最新最全面的SQL优化干货总结

    作者:_陈哈哈原文:https://sohu.gg/FGG98i BATJTMD 等大厂的面试难度越来越高,但无论从大厂还是到小公司,一直不变的重点就是对 SQL 优化经验的考察.一提到数据库,面试官 ...

  2. sql查询无结果返回空_3分钟短文 | Laravel 查询结果检查是不是空,5个方法你别用错...

    引言 Laravel 提供了 Eloquent ORM 对象用于操作数据库,将其进行抽象方便操作. 因为设计的灵活度,大家在使用Model查询数据集的时候,会面临结果为空,记录不存在的问题, 那么如何 ...

  3. mvc 前段定义变量_3分钟短文 | Laravel blade模板里优雅地定义PHP变量

    引言 Laravel秉持MVC的设计理念,在V = view 中放置视图相关的内容.特别是 blade 模板引擎带来了很强大的解析方式. 与传统的PHP与HTML写作一团方式不容,Blade 使用特定 ...

  4. laravel $request 多维数组取值_3分钟短文 | Laravel 内3种数据校验的写法,你喜欢哪一个?...

    引言 web应用程序公开访问几乎没有不带用户交互的,难免要接收用户输入的奇奇怪怪的东西.对于后端程序,必须对输入的内容进行有效性过滤. 这就是本文的重点,说一说laravel中输入请求的校验. 学习时 ...

  5. PLSQ执行同样的sql,使用mybatis进行动态拼装执行的时候非常慢的问题解决

    如题,项目中碰到了同样的sql,在plsql中执行很快,几乎秒出,但在程序中使用mybatis框架时,却非常的慢,前提是动态拼装的sql.在使用写死的参数,不会出现很慢的效果.最后发现是使用 #{xx ...

  6. Ajax解析laravelJSON,3分钟短文:Laravel请求体内JSON格式数据的处理办法

    原标题:3分钟短文:Laravel请求体内JSON格式数据的处理办法 引言 前几篇文章我们讲了表单数据的接收,验证等功能.也说到了传送的数组如何处理, 今天我们说一下如果传送的数据是JSON格式,其处 ...

  7. 使用FluentMybatis实现mybatis动态sql拼装和fluent api语法

    开始第一个例子: Hello World 新建Java工程,设置maven依赖 新建maven工程,设置项目编译级别为Java8及以上,引入fluent mybatis依赖包. <depende ...

  8. 语句作用_3分钟短文:Laravel模型作用域,为你“节省”更多代码

    引言 原则上代码写一次,处处是引用,不需要大量的冗余代码,这是一种趋势,也是提高代码健壮性的努力方向. laravel模型为我们提供了一层数据库操作层,将数据交互独立出来. 但是久而久之,随着项目的需 ...

  9. laravel mysql like_3分钟短文|Laravel 使用like匹配字符串的用法示例

    引言 本文接着laravel的功能讲解,说一说在模型中查询条件内,使用like这样的SQL关键字 进行子字符串匹配.并通过几个示例,和不同的实现方法,为大家展示laravel的灵活性. 学习时间 比如 ...

最新文章

  1. JQuery 扩展多语言支持
  2. 软工实践第四次作业——团队展示
  3. (一) 自带刷新的列表-LtRecyclerView v2.x版本(LtAdapter)(基本使用)
  4. Android-NDK-hello-jniCallback
  5. Request_获取ServletContext
  6. signature=c0b9be9cdeb0a9e14dbbc8edc1d4c0e5,NRZ-PM-QPSK 16
  7. bmf mysql_bmf 的动态 - SegmentFault 思否
  8. winscp连接windows_winscp登陆云主机,winscp登陆云主机如何登陆,教程详情
  9. Docker 集群环境实现的新方式
  10. VC++ 6.0 快捷键大全
  11. python重复字符串n次的函数_LeetCode_Python(3)_无重复字符的最长子串
  12. UGUI动态改变MatchWidthOrHeight
  13. QT的QWebEngineView内存泄漏
  14. 外企常用英语词汇或短语
  15. 评定职称/积分落户,原来软考证书含金量这么大!
  16. OAuth 2.0实战(一)-通俗光速入门
  17. mysql数据库应用经典案例_MySQL数据库“十宗罪”(十大经典错误案例)
  18. STM32和ROS串口通信常见问题汇总答疑
  19. SQL 全文检索应用
  20. Java基础知识(语言基础)

热门文章

  1. pandas使用fillna函数并设置bfill参数使用列中的后序值填充缺失值
  2. R语言可视化分别使用lattice包和ggplot2包可视化热图(heatmap)并绘制热力图对应的系统树图(dendrogram)实战
  3. R语言构建xgboost模型:交叉验证(cross validation)训练xgboost模型,配置自定义的损失函数评估函数并使用交叉验证训练xgboost模型
  4. 使用hyperopt(Bayesian optimization)为lightGBM模型挑选最优参数进行模型构建、by Cross Validation
  5. TCGAbiolinks包分析TCGA数据
  6. xmarin.android导航栏,android – 如何在xamarin表单中更改导航页面后退按钮
  7. java 行为模式_java – 模式匹配行为
  8. java display html_css html布局之display属性_动力节点Java学院整理
  9. java操作excel常用的两种方式
  10. windows系统服务器数据库,windows系统的服务器肿么访问数据库