Yii - 查询构建

  • 简述

    查询生成器允许您以编程方式创建 SQL 查询。查询生成器可帮助您编写更易读的 SQL 相关代码。
    要使用查询生成器,您应该按照以下步骤操作 -
    • 构建一个 yii\db\Query 对象。
    • 执行查询方法。
    要构建yii\db\Query对象,您应该调用不同的查询构建器函数来定义 SQL 查询的不同部分。
    Step 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 步- 转到http://localhost:8080/index.php?r=site/test-db,您将看到以下输出。
    查询生成器
  • where() 函数

    where()函数定义查询的WHERE 片段。要指定WHERE条件,可以使用三种格式。
    • 字符串格式- 'name = User10'
    • 哈希格式- ['name' => 'User10', 'email => user10@gmail.com']
    • 运算符格式- ['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);
    }
    
    以下将是输出。
    字符串格式示例输出

    哈希格式示例

    
    public function actionTestDb() {
       $user = (new \yii\db\Query())
          ->select(['id', 'name', 'email'])
          ->from('user')
          ->where([
             'name' => 'User5',
             'email' => 'user5@gmail.com'
          ])
          ->one();
       var_dump($user);
    }
    
    以下将是输出。
    哈希格式示例输出
    运算符格式允许您以以下格式定义任意条件 -
    
    [operator, operand1, operand2]
    
    操作员可以是 -
    • and - ['and', 'id = 1', 'id = 2'] 将生成 id = 1 AND id = 2 or: 类似于 and 运算符
    • between - ['between', 'id', 1, 15] 将生成 id BETWEEN 1 AND 15
    • not between - 类似于 between 运算符,但 BETWEEN 替换为 NOT BETWEEN
    • in - ['in', 'id', [5,10,15]] 将生成 id IN (5,10,15)
    • not in - 类似于 in 运算符,但 IN 替换为 NOT IN
    • like - ['like', 'name', 'user'] 将生成名称 LIKE '%user%'
    • or like - 类似于 like 运算符,但 OR 用于拆分 LIKE 谓词
    • not like - 类似于 like 运算符,但 LIKE 替换为 NOT LIKE
    • or not like - 类似于 not like 运算符,但 OR 用于连接 NOT LIKE 谓词
    • exists - 需要一个操作数,它必须是 yii\db\Query 类的一个实例
    • not exists- 类似于存在运算符,但构建一个不存在(子查询)表达式
    • <、<=、>、>=或任何其他 DB 运算符:['<', '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);
    }
    
    以下将是输出。
    OrderBy 函数示例输出
  • 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);
    }
    
    以下将是输出。
    groupBy 函数示例输出
    limit()和offset ()方法定义了LIMITOFFSET片段。
    示例-
    
    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 参数可以是列名或数据库表达式。