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

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

在业务代码中常常会根据不一样条件来查询,举个简单例子,咱们如今要查询用户列表,按时间倒序排列,可能会有status和type做为限定条件。html

一开始我是这样写的laravel

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集合。公共部分放在首尾,结构清晰,是否是高下立判啊?segmentfault

并且咱们还能够把$query当成参数传入方法或函数中,将公共逻辑封装在一块儿,方便多处调用:api

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:
How to create multiple where clause query using Laravel Eloquent? - stackoverflow
Model::query - laravelAPI

相关文章
相关标签/搜索