Yii - 数据访问对象

  • 简述

    执行一个SQL query,您应该按照以下步骤操作 -
    • 使用 SQL 查询创建一个yii\db\Command
    • 绑定参数(非必需)
    • 执行命令。
    第 1 步− 创建一个名为actionTestDb在站点控制器中。
    
    public function actionTestDb(){
       // return a set of rows. each row is an associative array of column names and values.
       // an empty array is returned if the query returned no results
       $users = Yii::$app->db->createCommand('SELECT * FROM user LIMIT 5')
          ->queryAll();
       var_dump($users);
       // return a single row (the first row)
       // false is returned if the query has no result
       $user = Yii::$app->db->createCommand('SELECT * FROM user WHERE id=1')
          ->queryOne();
       var_dump($user);
       // return a single column (the first column)
       // an empty array is returned if the query returned no results
       $userName = Yii::$app->db->createCommand('SELECT name FROM user')
          ->queryColumn();
       var_dump($userName);
       // return a scalar value
       // false is returned if the query has no result
       $count = Yii::$app->db->createCommand('SELECT COUNT(*) FROM user')
          ->queryScalar();
       var_dump($count);
    }
    
    上面的示例显示了从数据库中获取数据的各种方法。
    第 2 步− 前往地址http://localhost:8080/index.php?r=site/test-db,您将看到以下输出。
    创建 actionTestDb 输出
  • 创建 SQL 命令

    要创建带参数的 SQL 命令,应始终使用绑定参数的方法来防止 SQL 注入。
    第 1 步- 修改actionTestDb这种方法。
    
    public function actionTestDb() {
       $firstUser = Yii::$app->db->createCommand('SELECT * FROM user WHERE id = :id')
          ->bindValue(':id', 1)
          ->queryOne();
       var_dump($firstUser);
       $params = [':id' => 2, ':name' => 'User2'];
       $secondUser = Yii::$app->db->createCommand('SELECT * FROM user WHERE
          id = :id AND name = :name')
          ->bindValues($params)
          ->queryOne();
       var_dump($secondUser);
          //another approach
       $params = [':id' => 3, ':name' => 'User3'];
       $thirdUser = Yii::$app->db->createCommand('SELECT * FROM user WHERE
          id = :id AND name = :name', $params)
          ->queryOne();
       var_dump($thirdUser);
    }
    
    在上面的代码中 -
    • bindValue()− 绑定单个参数值。
    • bindValues()− 绑定多个参数值。
    第 2 步- 如果你去地址http://localhost:8080/index.php?r=site/test-db,您将看到以下输出。
    修改 actionTestDb 输出

    插入、更新和删除查询

    对于 INSERT、UPDATE 和 DELETE 查询,您可以调用 insert()、update() 和 delete() 方法。
    第 1 步- 修改actionTestDb这种方法。
    
    public function actionTestDb() {
       public function actionTestDb(){
          // INSERT (table name, column values)
          Yii::$app->db->createCommand()->insert('user', [
             'name' => 'My New User',
             'email' => 'mynewuser@gmail.com',
          ])->execute();
          $user = Yii::$app->db->createCommand('SELECT * FROM user WHERE name = :name')
             ->bindValue(':name', 'My New User')
             ->queryOne();
          var_dump($user);
          // UPDATE (table name, column values, condition)
          Yii::$app->db->createCommand()->update('user', ['name' => 'My New User
             Updated'], 'name = "My New User"')->execute();
          $user = Yii::$app->db->createCommand('SELECT * FROM user WHERE name = :name')
             ->bindValue(':name', 'My New User Updated')
             ->queryOne();
          var_dump($user);
          // DELETE (table name, condition)
          Yii::$app->db->createCommand()->delete('user', 'name = "My New User
             Updated"')->execute();
          $user = Yii::$app->db->createCommand('SELECT * FROM user WHERE name = :name')
             ->bindValue(':name', 'My New User Updated')
             ->queryOne();
          var_dump($user);
       }
    }
    
    第 2 步- 输入网址http://localhost:8080/index.php?r=site/test-db在网络浏览器的地址栏中,您将看到以下输出。
    插入更新删除查询示例