多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# where子句 ### [](https://octobercms.com/docs/database/query#where-clauses)Where子句 #### 简单的where子句 要将`where`子句添加到查询,请`where`在查询构建器实例上使用方法。最基本的调用`where`需要三个参数。第一个参数是列的名称。第二个参数是运算符,可以是数据库支持的任何运算符。第三个参数是要针对该列求值的值。 例如,下面是一个查询,该查询验证“ votes”列的值等于100: ~~~ $users = Db::table('users')->where('votes', '=', 100)->get(); ~~~ 为方便起见,如果您只是想验证一列是否等于给定值,则可以将该值作为第二个参数直接传递给该`where`方法: ~~~ $users = Db::table('users')->where('votes', 100)->get(); ~~~ 当然,在编写`where`子句时,您可以使用其他各种运算符: ~~~ $users = Db::table('users') ->where('votes', '>=', 100) ->get(); $users = Db::table('users') ->where('votes', '<>', 100) ->get(); $users = Db::table('users') ->where('name', 'like', 'T%') ->get(); ~~~ #### “或”语句 您可以将约束链接在一起,也`or`可以在查询中添加子句。该`orWhere`方法接受与该方法相同的参数`where`: ~~~ $users = Db::table('users') ->where('votes', '>', 100) ->orWhere('name', 'John') ->get(); ~~~ > **提示:**您还可以前缀`or`到任何地方陈述方式下面,使条件的“OR”的条件-例如`orWhereBetween`,`orWhereIn`等等。 #### “之间”声明 该`whereBetween`方法验证列的值是否在两个值之间: ~~~ $users = Db::table('users') ->whereBetween('votes', [1, 100])->get(); ~~~ 该`whereNotBetween`方法验证列的值是否位于两个值之外: ~~~ $users = Db::table('users') ->whereNotBetween('votes', [1, 100]) ->get(); ~~~ #### “在哪里”声明 该`whereIn`方法验证给定数组中是否包含给定列的值: ~~~ $users = Db::table('users') ->whereIn('id', [1, 2, 3]) ->get(); ~~~ 该`whereNotIn`方法验证给定数组中**不**包含给定列的值: ~~~ $users = Db::table('users') ->whereNotIn('id', [1, 2, 3]) ->get(); ~~~ #### “ Where null”语句 该`whereNull`方法验证给定列的值为`NULL`: ~~~ $users = Db::table('users') ->whereNull('updated_at') ->get(); ~~~ 该`whereNotNull`方法验证列的值**不是**`NULL`: ~~~ $users = Db::table('users') ->whereNotNull('updated_at') ->get(); ~~~ ### [](https://octobercms.com/docs/database/query#advanced-where-clauses)高级where子句 #### 参数分组 有时,您可能需要创建更高级的where子句,例如“ where where”或嵌套参数分组。Laravel查询构建器也可以处理这些。首先,让我们看一下括号内分组约束的示例: ~~~ Db::table('users') ->where('name', '=', 'John') ->orWhere(function ($query) { $query->where('votes', '>', 100) ->where('title', '<>', 'Admin'); }) ->get(); ~~~ 如您所见,传递`Closure`给`orWhere`方法将指示查询构建器开始约束组。该`Closure`会收到您可以使用设置应包含在括号组内的约束的查询生成器实例。上面的示例将产生以下SQL: ~~~ select * from users where name = 'John' or (votes > 100 and title <> 'Admin') ~~~ #### 存在陈述 该`whereExists`方法允许您编写`where exist`SQL子句。该`whereExists`方法接受一个`Closure`参数,该参数将接收一个查询构建器实例,该实例允许您定义应放置在“ exists”子句中的查询: ~~~ Db::table('users') ->whereExists(function ($query) { $query->select(Db::raw(1)) ->from('orders') ->whereRaw('orders.user_id = users.id'); }) ->get(); ~~~ 上面的查询将产生以下SQL: ~~~ select * from users where exists ( select 1 from orders where orders.user_id = users.id ) ~~~ #### JSON“ where”语句 October CMS还支持在提供对JSON列类型的支持的数据库上查询JSON列类型。要查询JSON列,请使用`->`运算符: ~~~ $users = Db::table('users') ->where('options->language', 'en') ->get(); $users = Db::table('users') ->where('preferences->dining->meal', 'salad') ->get(); ~~~ 您可以`whereJsonContains`用来查询JSON数组(SQLite不支持): ~~~ $users = Db::table('users') ->whereJsonContains('options->languages', 'en') ->get(); ~~~ MySQL和PostgreSQL支持`whereJsonContains`多个值: ~~~ $users = Db::table('users') ->whereJsonContains('options->languages', ['en', 'de']) ->get(); ~~~ 您可以用来`whereJsonLength`按其长度查询JSON数组: ~~~ $users = Db::table('users') ->whereJsonLength('options->languages', 0) ->get(); $users = Db::table('users') ->whereJsonLength('options->languages', '>', 1) ->get(); ~~~ ### [](https://octobercms.com/docs/database/query#conditional-clauses)条件条款 有时,您可能希望子句仅在其他情况成立时才应用于查询。例如,`where`如果传入请求中存在给定的输入值,则您可能只想应用语句。您可以使用以下`when`方法完成此操作: ~~~ $role = $request->input('role'); $users = Db::table('users') ->when($role, function ($query, $role) { return $query->where('role_id', $role); }) ->get(); ~~~ 该`when`方法仅在第一个参数为时执行给定的闭包`true`。如果第一个参数是`false`,将不执行闭包。 您可以将另一个Closure作为方法的第三个参数传递`when`。如果第一个参数的值为假,则此闭包将执行。为了说明如何使用此功能,我们将使用它来配置查询的默认排序: ~~~ $sortBy = null; $users = Db::table('users') ->when($sortBy, function ($query, $sortBy) { return $query->orderBy($sortBy); }, function ($query) { return $query->orderBy('name'); }) ->get(); ~~~