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

各位看官,上午好,大家在进行多where约束时候如何写的呢?比如在进行列表分页查询带条件时候.
是 where->orwhere吗?
这里告诉大家,我们可以更见美观,方便的,随心所欲的写where子句.
下面我们开讲:
这里我们讲一个参数分组(约束组)的概念.
首先,参数分组.
有时候你需要创建更高级的 where 子句,例如「where exists」或者嵌套的参数分组。Laravel 的查询构造器也能够处理这些。下面,让我们看一个在括号中进行分组约束的例子:
$users = DB::table('users')
->where('name', '=', 'John')
->where(function ($query) {
$query->where('votes', '>', 100)
->orWhere('title', '=', 'Admin');
})
->get();
你可以看到,通过一个 Closure 写入 where 方法构建一个查询构造器 来约束一个分组。这个 Closure 接收一个查询实例,你可以使用这个实例来设置应该包含的约束。上面的例子将生成以下 SQL:
select * from users where name = 'John' and (votes > 100 or title = 'Admin')
{提示} 你应该用 orWhere 调用这个分组,以避免应用全局作用出现意外。
2. 那么在模型关联中,我们会有这种情况使用到约束组
在关联之后链式添加 orWhere 条件
你可以在查询关联时自由添加其他约束。但是,在将 orWhere 子句链接到关联时要小心,因为 orWhere 子句将在逻辑上与关联约束处于同一级别:
$user->posts()
->where('active', 1)
->orWhere('votes', '>=', 100)
->get();
// select * from posts
// where user_id = ? and active = 1 or votes >= 100
在大多数情况下,你可以使用约束组 在括号中对条件检查进行逻辑分组:
$user->posts()
->where(function (Builder $query) {
return $query->where('active', 1)
->orWhere('votes', '>=', 100);
})
->get();
// select * from posts
// where user_id = ? and (active = 1 or votes >= 100)
3. 在哪些情况下我们还是用where约束组而不是用orwhere?
尤其你是多个参数传递进来,我们需要进行判断时候
例如:我们在进行列表时候,分页,查询条件.
我们合起来可以这么写
// 直接导入request 进行查询
$user = User::orderBy('user_id','asc')
->where(function($query) use($request){
$username = $request->input('username');
$email = $request->input('email');
if(!empty($username)){
$query->where('username','like','%'.$username.'%');
}
if(!empty($email)){
$query->where('username','like','%'.$email.'%');
}
})
->paginate($request->input('num')?$request->input('num'):3);
// 如何看这段多参数查询列表的 $query对象
// 答 这是查询构造器中的参数分组
// 一个在括号中进行分组约束的例子
// 此处我们通过闭包.来得到query 传入$request参数
// 来进行处理,最后在闭包中写逻辑,直接得到我们一整个query对象
// 进而传递给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