Yii查询生成器

查询生成器允许以编程的方式来创建 SQL 查询。 QueryBuilder帮助您编写更加易读的 SQL 相关的代码。
要使用查询生成器,应该遵循以下步骤 -
  • 构造一个 yii\db\Query 对象.
  • 执行 query() 方法
要构建立一个 yii\db\Query 对象,应该调用不同的查询生成器函数来定义 SQL 查询的不同部分。
第1步 - 要演示查询生成器的典型用法,修改 actionTestDb() 方法使用以下代码。
public function actionTestDb() {
   //generates "SELECT id, name, email FROM user WHERE name = 'User10';"
   $user = (new \yii\db\Query())
      ->select(['id', 'name', 'email'])
      ->from('user')
      ->where(['name' => 'User10'])
      ->one();
   var_dump($user);
}
第2步 - 在浏览器打开URL地址:http://localhost:8080/index.php?r=site/test-db ,会看到输出如下图所示。
Yii查询生成器

Where()函数

在 where() 函数定义了一个查询的 WHERE 段。要指定 WHERE 条件,可以使用以下三种格式:
  • string 格式 − 'name = User10'

  • hash 格式 − ['name' => 'User10', 'email => user10@gmail.com']

  • operator 格式 − ['like', 'name', 'User']

字符串格式的示例

public function actionTestDb() {
   $user = (new \yii\db\Query())
      ->select(['id', 'name', 'email'])
      ->from('user')
      ->where('name = :name', [':name' => 'User11'])
      ->one();
   var_dump($user);
}
输出结果如下图所示:
Yii查询生成器

哈希格式的例子

public function actionTestDb() {
   $user = (new \yii\db\Query())
      ->select(['id', 'name', 'email'])
      ->from('user')
      ->where([
         'name' => 'User5',
         'email' => 'user55@gmail.com'
      ])
      ->one();
   var_dump($user);
}

输出结果如下图所示:

运算符格式化允许定义任意条件的格式如下 -
[operator, operand1, operand2]
操作符可以是 -
  • and − ['and', 'id = 1', 'id = 2'] 会产生类似: id = 1 AND id = 2

  • between − ['between', 'id', 1, 15] 会产生类似:id BETWEEN 1 AND 15

  • not between − 类似 between 操作符, 但是 BETWEEN 被替换为 NOT BETWEEN

  • in − ['in', 'id', [5,10,15]] 会产生类似: IN (5,10,15)

  • not in − 类似  in 操作符,但是 IN 被替换为 NOT IN

  • like − ['like', 'name', 'user'] 会产生类似: name LIKE '%user%'

  • or like − 类似  like 操作符, 但是 OR 用来分割 LIKE 谓词

  • not like − 类似于 like 操作符, 但是 LIKE 被 NOT LIKE 替代; 

  • or not like − 类似 not like 运算符,但或用来连接 NOT LIKE 谓词

  • exists − 要求一个操作数必须是 yii\db\Query 类的一个实例

  • not exists − 类似 exists 操作符,但是构建了一个NOT EXISTS(子查询)的表达式

  • <, <=, >, >=, 或任何其他数据库操作符: ['<', 'id', 10] 会产生类似: id<10

操作符格式示例 -

public function actionTestDb() {
   $users = (new \yii\db\Query())
      ->select(['id', 'name', 'email'])
      ->from('user')
      ->where(['between', 'id', 5, 7])
      ->all();
   var_dump($users);
}

输出结果如下图所示:

OrderBy()函数

在 orderBy() 函数中定义了 ORDER BY 段。

如下示例 −

public function actionTestDb() {
   $users = (new \yii\db\Query())
      ->select(['id', 'name', 'email'])
      ->from('user')
      ->orderBy('name DESC')
      ->all();
   var_dump($users);
}

输出结果如下图所示:

groupBy()函数

groupBy()函数定义了 GROUP BY 段,having()方法指定 HAVING 段。

如下示例 −

public function actionTestDb() {
   $users = (new \yii\db\Query())
      ->select(['id', 'name', 'email'])
      ->from('user')
      ->groupBy('name')
      ->having('id < 5')
      ->all();
   var_dump($users);
}

输出结果如下图所示:

limit() 和 offset() 方法定义了 LIMIT 和 OFFSET 段。

如下示例 −

public function actionTestDb() {
   $users = (new \yii\db\Query())
      ->select(['id', 'name', 'email'])
      ->from('user')
      ->limit(5)
      ->offset(5)
      ->all();
   var_dump($users);
}

输出结果如下图所示:

yii\db\Query 类提供了一组用于不同的目的的方法 -
  • all() − 返回一行为名称-值对的数组。

  • one() − 返回第一行

  • column() − 返回第一列

  • scalar() − 返回结果的第一行和第一列的标量值。

  • exists() − 返回指示查询是否包含任何结果值

  • count() 返回COUNT查询结果

  • 其他聚集查询方法 - 包括:sum($q), average($q), max($q), min($q)。$q 参数可以是列名 或 DB 表达式。

上一篇: Yii数据访问对象 下一篇: Yii活动记录(Active Record)