Code前端首页关于Code前端联系我们

Laravel 编程技巧:Query Builder 覆盖链调用方法

terry 2年前 (2023-09-25) 阅读数 52 #后端开发

laravel Query Builder 覆盖链调用相关信息,文章通过示例代码详细介绍,对于大家的学习或者工作都有重要的参考学习价值,有需要的朋友可以下面就来看看吧。

查询构建器简介

Laravel 查询构建器(query builder)提供了一个方便、流畅的界面来创建和执行数据库搜索语法

使用 PDO 参数绑定来保护应用程序免受 SQL 注入。因此,传递的参数不需要转义特殊字符

其实可以满足所有的数据库操作,并且可以在所有支持的数据库系统中执行

介绍

今天介绍laravel查询。 Craftsman 官方文档的例子中没有详细提到一个小技巧。这并不是什么高级技能。很多人可能会使用它。不知道的同学可以看看。

在业务代码中,查询通常是根据不同的条件创建的。举个简单的例子,现在我们要查询一个用户列表,按照时间倒序排列,状态和类型可以作为限定条件。

我一开始就是这么写的

 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();

使用变量来存储查询构造函数的实例,然后添加约束,最后得到一个集合。公共部分放在开头和结尾,结构清晰。这是一个判断吗?

而且我们还可以将$query作为参数发送给方法或函数,将常用的逻辑封装在一起,方便多次调用:

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

这个写法有一个注意点,如果你在$query中调用where等待约束方法将更改此查询。有时我们需要先克隆查询。

比如我们要同时请求类型1和类型2的用户

 $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门面表方法来启动查询。这个table方法为查询表生成了一个示例查询生成器,这样查询时可以接触更多的约束,并使用get方法得到最终的结果,我当时觉得很做作,不是所有的搜索引擎,因为我当时没有使用谷歌。现在我不想和只会百度的人一起工作。百度只是广告搜索,所有的搜索结果都是狗屎。

Google 和 stackoverflow 太棒了。很多人都有丰富的知识和专业的答案。从计算机历史到操作系统、数据库、各种编程语言,他帮我调试了很多bug。在segmentfault上做这样的广告是不是很糟糕?逃脱!

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门