Laravl 子句
Where子句
简单 Where 子句
使用查询构建器上的 where
方法可以添加 where
子句到查询中,调用where
最基本的方式需要传递三个参数,第一个参数是列名,第二个参数是任意一个数据库系统支持的操作符,第三个参数是该列要比较的值。
//以下两行代码 效果一样
$users = User::where('id','=', 9)->get()->toArray();
$users = User::where('id', 9)->get()->toArray();
为了方便,如果你只是简单比较列值和给定数值是否相等,可以将数值直接作为
where
方法的第二个参数
我们还可以传递一个条件数组给where
$users = User::where([
['id','>',8],
['price', '>',200]
])
->get()
->toArray();
SQl :
select * from `bl_user` where (`id` > '8' and `price` > '200')
or 语句
你可以通过方法链将多个 where
约束链接到一起,也可以添加 or 子句到查询,orWhere
方法和 where
方法接收参数一样:
$users = User::where('id' ,'>',10)
->orWhere('price', '>' ,100)
->get()
->toArray();
其他的where查询参见文档 :https://laravelacademy.org/post/8060.html#toc_3
参数分组
有时候你需要创建更加高级的where
子句,比如“where exists”或者嵌套的参数分组。Laravel 查询构建器也可以处理这些。作为开始,让我们看一个在括号中进行分组约束的例子:
$users = User::where('id', '>', 10)
->orwhere(function ($query) {
$query->where('price', '>', '50')
->where('name', 'Marun');
})
->get()
->toArray();
正如你所看到的,传递闭包到 orWhere
方法构造查询构建器来开始一个约束分组,该闭包将会获取一个用于设置括号中包含的约束的查询构建器实例。上述语句等价于下面的 SQL:
select * from `bl_user` where `id` > '10' or (`price` > '50' and `name` = 'Marun')
where exists子句
whereExists 方法允许你编写 where exists SQL 子句,whereExists 方法接收一个闭包参数,该闭包获取一个查询构建器实例从而允许你定义放置在“exists”子句中的查询:
$users = User::whereExists(function ($query){
$query->selectRaw(1)->from('book')->whereRaw('bl_book.id > 5');
})->get()->toArray();
上述查询等价于下面的 SQL 语句:
select * from `bl_user` where exists (select 1 from `bl_book` where bl_book.id > 5)
JSON Where子句
Laravel 还支持在提供 JSON 字段类型的数据库(目前是 MySQL 5.7 和 PostgresSQL)上使用操作符 -> 获取指定 JSON 字段值:
$users = DB::table('users')
->where('options->language', 'en')
->get();
$users = DB::table('users')
->where('preferences->dining->meal', 'salad')
->get();
排序、分组、限定
orderBy
orderBy
方法允许你通过给定字段对结果集进行排序,orderBy
的第一个参数应该是你希望排序的字段,第二个参数控制着排序的方向 ——asc
或 desc
:
$users = DB::table('users')
->orderBy('name', 'desc')
->get();
latest / oldest
latest
和 oldest
方法允许你通过日期对结果进行排序,默认情况下,结果集根据 created_at
字段进行排序,或者,你可以按照你想要排序的字段作为字段名传入:
$user = DB::table('users')
->latest()
->first();
inRandomOrder
inRandomOrder
方法可用于对查询结果集进行随机排序,比如,你可以用该方法获取一个随机用户:
$randomUser = DB::table('users')
->inRandomOrder()
->first();
groupBy / having
groupBy
和having
方法用于对结果集进行分组,having
方法和 where
方法的用法类似:
$users = DB::table('users')
->groupBy('account_id')
->having('account_id', '>', 100)
->get();
skip / take
想要限定查询返回的结果集的数目,或者在查询中跳过给定数目的结果,可以使用skip
和 take
方法:skip = offest
take = limit
$users = DB::table('users')->skip(10)->take(5)->get();
作为替代方法,还可以使用 limit 和 offset 方法:
$users = DB::table('users')
->offset(10)
->limit(5)
->get();
条件子句
有时候你可能想要某些条件为true
的时候才将条件子句应用到查询。例如,你可能只想给定值在请求中存在的情况下才应用 where
语句,这可以通过when
方法实现:
$id = $request->input('id');
$users = User::when($id,function ($query) use ($id){
return $query->where('id',$id);
})->get()->toArray();
when
方法只有在第一个参数为 true 的时候才执行给定闭包,如果第一个参数为 false,则闭包不执行。
你可以传递另一个闭包作为 when
方法的第三个参数,该闭包会在第一个参数为 false
的情况下执行。为了演示这个特性如何使用,我们来配置一个查询的默认排序:
$sortBy = null;
$users = User::when($sortBy, function ($query) use ($sortBy) {
return $query->orderBy($sortBy);
}, function ($query) {
return $query->orderBy('name');
})
->get()
->toArray();
推荐阅读
-
throws子句在继承当中overrride时有什么规则?
-
dreamweaver cs4错误提示FROM子句语法错误的解决方法
-
6.InfluxDB-InfluxQL基础语法教程--GROUP BY子句
-
9.InfluxDB-InfluxQL基础语法教程--LIMIT and SLIMIT 子句
-
sql语句之where子句
-
sql语句之from子句
-
SQL中where子句与having子句的区别小结
-
ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效怎么解决?
-
松软科技web课堂:SQLServer之HAVING 子句
-
6.MySQL必知必会之数据过滤-WHERE组合子句