欢迎光临散文网 会员登陆 & 注册

laravel实战代码-创建更高级的 where 子句

2019-10-16 10:59 作者:汪春波  | 我要投稿

laravel实战代码-讲解1-laravel查询构造器之参数分组:创建更高级的 where 子句-用where约束组而不是用orwhere


各位看官,上午好,大家在进行多where约束时候如何写的呢?比如在进行列表分页查询带条件时候.

是 where->orwhere吗?

这里告诉大家,我们可以更见美观,方便的,随心所欲的写where子句.

下面我们开讲:


这里我们讲一个参数分组(约束组)的概念.

首先,参数分组.

有时候你需要创建更高级的 where 子句,例如「where exists」或者嵌套的参数分组。Laravel 的查询构造器也能够处理这些。下面,让我们看一个在括号中进行分组约束的例子:

  1. $users = DB::table('users')

  2.           ->where('name', '=', 'John')

  3.           ->where(function ($query) {

  4.               $query->where('votes', '>', 100)

  5.                     ->orWhere('title', '=', 'Admin');

  6.           })

  7.           ->get();

你可以看到,通过一个 Closure 写入 where 方法构建一个查询构造器 来约束一个分组。这个 Closure 接收一个查询实例,你可以使用这个实例来设置应该包含的约束。上面的例子将生成以下 SQL:

  1. select * from users where name = 'John' and (votes > 100 or title = 'Admin')

{提示} 你应该用 orWhere 调用这个分组,以避免应用全局作用出现意外。


2. 那么在模型关联中,我们会有这种情况使用到约束组

在关联之后链式添加 orWhere 条件

你可以在查询关联时自由添加其他约束。但是,在将 orWhere 子句链接到关联时要小心,因为 orWhere 子句将在逻辑上与关联约束处于同一级别:

  1. $user->posts()

  2.        ->where('active', 1)

  3.        ->orWhere('votes', '>=', 100)

  4.        ->get();


  5. // select * from posts

  6. // where user_id = ? and active = 1 or votes >= 100

在大多数情况下,你可以使用约束组 在括号中对条件检查进行逻辑分组:

  1. $user->posts()

  2.        ->where(function (Builder $query) {

  3.            return $query->where('active', 1)

  4.                         ->orWhere('votes', '>=', 100);

  5.        })

  6.        ->get();


  7. // select * from posts

  8. // where user_id = ? and (active = 1 or votes >= 100)


3. 在哪些情况下我们还是用where约束组而不是用orwhere?

尤其你是多个参数传递进来,我们需要进行判断时候

例如:我们在进行列表时候,分页,查询条件. 
我们合起来可以这么写


  1. //        直接导入request 进行查询

  2.        $user = User::orderBy('user_id','asc')

  3.            ->where(function($query) use($request){

  4.                $username = $request->input('username');

  5.                $email = $request->input('email');

  6.                if(!empty($username)){

  7.                    $query->where('username','like','%'.$username.'%');

  8.                }

  9.                if(!empty($email)){

  10.                    $query->where('username','like','%'.$email.'%');

  11.                }

  12.            })

  13.            ->paginate($request->input('num')?$request->input('num'):3);


  14.        // 如何看这段多参数查询列表的 $query对象

  15.        // 答  这是查询构造器中的参数分组

  16. //        一个在括号中进行分组约束的例子


  17. //        此处我们通过闭包.来得到query 传入$request参数

  18. //        来进行处理,最后在闭包中写逻辑,直接得到我们一整个query对象

  19. //        进而传递给where



看完上面这个代码,是不是感觉舒服很多,代码也好看了.

ps:这个闭包后跟了一个use.解释如下: 
闭包的语法很简单,需要注意的关键字就只有use,use意思是连接闭包和外界变量。

匿名函数中的use,其作用就是从父作用域继承变量。


引用文档:

https://learnku.com/docs/laravel/6.x/queries/5171#parameter-grouping

https://learnku.com/docs/laravel/6.x/eloquent-relationships/5177


laravel实战代码-创建更高级的 where 子句的评论 (共 条)

分享到微博请遵守国家法律