
本文共 3214 字,大约阅读时间需要 10 分钟。
Where子句
Where子句是Eloquent查询构建器中的一个强大工具,用于在数据库查询中添加条件过滤。它允许你通过指定列名、操作符以及对应的值,来筛选出符合条件的记录。
简单Where子句
最基本的Where子句使用方式是调用where
方法,传递三个参数:列名、操作符以及值。 Laravel 查询构建器的where
方法非常灵活,支持传递数值、字符串或其他数据类型的值,同时也可以传递包含多个条件的数组。以下是两种使用方式的示例:
// 两种方式效果相同$users = User::where('id', '=', 9)->get()->toArray();$users = User::where('id', 9)->get()->toArray();
**备注**:第二个参数可以是数据库系统支持的任何操作符,例如>、<、>=等。如果你是在简单比较数值与列值,可以直接传递数值作为第二个参数。同时,也可以传递一个包含多个判断条件的数组到where
方法中。
例如下面的查询会生成以下SQL:
select * from `bl_user` where (`id` > '8' and `price` > '200')
**代码示例**:
$users = User::where(['id', 'greater than', 8], ['price', 'greater than', 200]) >get() >toArray();
或条件
你可以使用orWhere
方法将多个Where子句链接到一起,或者使用or
方法对查询叠加更多条件。例如:
// 使用orWhere建立多个Where条件$users = User::where('id', 'greater than', 10) >orWhere('price', 'greater than', 100) >get() >toArray();
以上查询相当于以下SQL:
select * from `bl_user` where `id` > '10' or (`price` > '100')
参数分组
如果需要构建更复杂的Where子句,例如带有括号的条件组合,可以使用查询构建器中的orwhere
方法传递一个闭包。该闭包将接收一个新的查询构建器实例,你可以在闭包中添加更多Where条件。例如:
// 传递闭包来构建条件组合$users = User::where('id', 'greater than', 10) >orwhere(function ($query) { $query->where('price', 'greater than', '50')->where('name', 'Marun');}) >get() >toArray();
上述查询生成的SQL与以下相当:
select * from `bl_user` where `id` > '10' or (`price` > '50' and `name` = 'Marun')
**switch子句**
如果需要使用“A也”存在的条件,可以使用whereExists
方法。该方法接受一个闭包,闭包内可以定义一个新的查询构建器实例来满足exists
子句的要求。
// 使用whereExists定义"A也"存在的条件$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支持在特定数据库(如MySQL 5.7和PostgreSQL)上使用JSON字段类型,并通过特定的操作符获取指定的JSON字段值。例如:
// 适用于MySQL 5.7或PostgreSQL$users = DB::table('users') >where('options->language', 'en') >get();$users = DB::table('users') >where('preferences->dining->meal', 'salad') >get();
排序、分组、限定
orderBy
方法允许你按指定字段对结果集进行排序,可以指定asc
或desc
方向。
// 按照名字降序排序$users = DB::table('users') >orderBy('name', 'desc') >get();
latest
和oldest
方法用于按日期排序,默认排序字段是created_at
,你也可以指定其他字段。
// 获取最新的用户记录$user = DB::table('users') >latest() >first();
inRandomOrder
方法用于随机排序结果集,常用于获取随机用户记录。
// 随机获取一个用户记录$randomUser = DB::table('users') >inRandomOrder() >first();
groupBy
和having
方法用于对结果集进行分组,having
方法的使用方式与where
方法类似。
// 按account_id分组并根据条件筛选$users = DB::table('users') >groupBy('account_id') >having('account_id', 'greater than', 100) >get();
skip
和take
方法用于限制返回的结果数量。其中skip
指定偏移量,take
指定最多返回多少条记录。
// � userData offset(假设userData是待处理的数据)$users = DB::table('users') >skip(10) >take(5) >get();
或者可以使用offset
和limit
方法来实现相同的功能:
// 使用offset和limit方法$users = DB::table('users') >offset(10) >limit(5) >get();
条件子句
在某些情况下,你可能需要条件化地应用Where子句。例如,只有当特定条件满足时才应用Where子句,可以使用when
方法实现。
// 动态应用Where子句$id = $request->input('id');$users = User::when($id, function ($query) use ($id) { return $query->where('id', $id);}) >get() >toArray();
**备注**:when
方法的第一个参数是布尔判断,如果为true则执行闭包内的逻辑;如果为false,则闭包内的逻辑不会执行。同时,你可以传递第二个闭包作为默认处理逻辑,使得当第一个条件不满足时,执行第二个闭包的逻辑。例如:
// 动态应用Where子句的默认排序$sortBy = null;$users = User::when($sortBy, function ($query) use ($sortBy) { return $query->orderBy($sortBy);}, function ($query) { return $query->orderBy('name');}) >get() >toArray();
发表评论
最新留言
关于作者
