Laravel 编程技巧:Query Builder 覆盖链调用方法
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前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。