当前位置:K88软件开发文章中心网站服务器框架Yii 2.0 → 文章内容

查询生成器(Query Builder): 使用简单抽象层查询数据库

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-26 15:28:58

')->from('user');// ...WHERE `id` IN (SELECT `id` FROM `user`)$query->where(['id' => $userQuery]);操作符格式操作符格式允许你指定类程序风格的任意条件语句,如下所示:[操作符, 操作数1, 操作数2, ...]其中每个操作数可以是字符串格式、哈希格式或者嵌套的操作符格式,而操作符可以是如下列表中的一个:and: 操作数会被?AND?关键字串联起来。例如,['and', 'id=1', 'id=2']?将会生成?id=1 AND id=2。如果操作数是一个数组,它也会按上述规则转换成 字符串。例如,['and', 'type=1', ['or', 'id=1', 'id=2']]?将会生成?type=1 AND (id=1 OR id=2)。 这个方法不会自动加引号或者转义。or: 用法和?and?操作符类似,这里就不再赘述。between: 第一个操作数为字段名称,第二个和第三个操作数代表的是这个字段 的取值范围。例如,['between', 'id', 1, 10]将会生成?id BETWEEN 1 AND 10。not between: 用法和?BETWEEN?操作符类似,这里就不再赘述。in: 第一个操作数应为字段名称或者 DB 表达式。第二个操作符既可以是一个数组, 也可以是一个?Query?对象。它会转换成IN条件语句。如果第二个操作数是一个 数组,那么它代表的是字段或 DB 表达式的取值范围。如果第二个操作数是?Query?对象,那么这个子查询的结果集将会作为第一个操作符的字段或者 DB 表达式的取值范围。 例如,?['in', 'id', [1, 2, 3]]?将生成?id IN (1, 2, 3)。 该方法将正确地为字段名加引号以及为取值范围转义。in?操作符还支持组合字段,此时, 操作数1应该是一个字段名数组,而操作数2应该是一个数组或者?Query?对象, 代表这些字段的取值范围。not in: 用法和?in?操作符类似,这里就不再赘述。like: 第一个操作数应为一个字段名称或 DB 表达式,第二个操作数可以使字符串或数组, 代表第一个操作数需要模糊查询的值。比如,['like', 'name', 'tester']?会生成?name LIKE '%tester%'。 如果范围值是一个数组,那么将会生成用?AND?串联起来的 多个?like?语句。例如,['like', 'name', ['test', 'sample']]?将会生成?name LIKE '%test%' AND name LIKE '%sample%'。 你也可以提供第三个可选的操作数来指定应该如何转义数值当中的特殊字符。 该操作数是一个从需要被转义的特殊字符到转义副本的数组映射。 如果没有提供这个操作数,将会使用默认的转义映射。如果需要禁用转义的功能, 只需要将参数设置为?false?或者传入一个空数组即可。需要注意的是, 当使用转义映射(又或者没有提供第三个操作数的时候),第二个操作数的值的前后 将会被加上百分号。注意:当使用 PostgreSQL 的时候你还可以使用?ilike, > 该方法对大小写不敏感。or like: 用法和?like?操作符类似,区别在于当第二个操作数为数组时, 会使用?OR?来串联多个?LIKE?条件语句。not like: 用法和?like?操作符类似,区别在于会使用?NOT LIKE?来生成条件语句。or not like: 用法和?not like?操作符类似,区别在于会使用?OR?来串联多个?NOT LIKE?条件语句。exists: 需要一个操作数,该操作数必须是代表子查询 yii\db\Query 的一个实例, 它将会构建一个?EXISTS (sub-query)?表达式。not exists: 用法和?exists?操作符类似,它将创建一个?NOT EXISTS (sub-query)?表达式。>,?<=, 或者其他包含两个操作数的合法 DB 操作符: 第一个操作数必须为字段的名称, 而第二个操作数则应为一个值。例如,['>', 'age', 10]?将会生成?age>10。附加条件你可以使用 yii\db\Query::andWhere() 或者 yii\db\Query::orWhere() 在原有条件的基础上 附加额外的条件。你可以多次调用这些方法来分别追加不同的条件。 例如,$status = 10;$search = 'yii';$query->where(['status' => $status]);if (!empty($search)) { $query->andWhere(['like', 'title', $search]);}如果?$search?不为空,那么将会生成如下 SQL 语句:... WHERE (`status` = 10) AND (`title` LIKE '%yii%')过滤条件当?WHERE?条件来自于用户的输入时,你通常需要忽略用户输入的空值。 例如,在一个可以通过用户名或者邮箱搜索的表单当中,用户名或者邮箱 输入框没有输入任何东西,这种情况下你想要忽略掉对应的搜索条件, 那么你就可以使用 yii\db\Query::filterWhere() 方法来实现这个目的:// $username 和 $email 来自于用户的输入$query->filterWhere([ 'username' => $username, 'email' => $email, ]);yii\db\Query::filterWhere() 和 yii\db\Query::where() 唯一的不同就在于,前者 将忽略在条件当中的hash format的空值。所以如果$email?为空而?$username?不为空,那么上面的代码最终将生产如下 SQL?...WHERE username=:username。提示:当一个值为 null、空数组、空字符串或者一个只包含空白字符时,那么它将被判定为空值。类似于 [yii\db\Query::andWhere()|andWhere()]] 和 yii\db\Query::orWhere(), 你可以使用 yii\db\Query::andFilterWhere() 和 yii\db\Query::orFilterWhere() 方法 来追加额外的过滤条件。yii\db\Query::orderBy()yii\db\Query::orderBy() 方法是用来指定 SQL 语句当中的?ORDER BY?子句的。例如,// ... ORDER BY `id` ASC, `name` DESC$query->orderBy([ 'id' => SORT_ASC, 'name' => SORT_DESC,]);如上所示,数组当中的键指代的是字段名称,而数组当中的值则表示的是排序的方式。 PHP 的常量?SORT_ASC?指的是升序排列,SORT_DESC?指的则是降序排列。如果?ORDER BY?仅仅包含简单的字段名称,你可以使用字符串来声明它, 就像写原生的 SQL 语句一样。例如,$query->orderBy('id ASC, name DESC');注意:当?ORDER BY?语句包含一些 DB 表达式的时候,你应该使用数组的格式。你可以调用 [yii\db\Query::addOrderBy()|addOrderBy()]] 来为?ORDER BY?片断添加额外的子句。 例如,$query->orderBy('id ASC') ->addOrderBy('name DESC');yii\db\Query::groupBy()yii\db\Query::groupBy() 方法是用来指定 SQL 语句当中的?GROUP BY?片断的。例如,// ... GROUP BY `id`, `status`$query->groupBy(['id', 'status']);如果?GROUP BY?仅仅包含简单的字段名称,你可以使用字符串来声明它, 就像写原生的 SQL 语句一样。例如,$query->groupBy('id, status');注意:当?GROUP BY?语句

上一页  [1] [2] [3] [4]  下一页


查询生成器(Query Builder): 使用简单抽象层查询数据库