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 => [email protected]']

  • 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' => '[email protected]'
      ])
      ->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 表示式。