Yii - Active Record

  • 简述

    Active Record 提供了一个面向对象的 API 来访问数据。Active Record 类与数据库表相关联。
    Yii 为以下关系数据库提供 Active Record 支持 -
    • MySQL 4.1 或更高版本
    • SQLite 2 和 3:
    • PostgreSQL 7.3 或更高版本
    • Microsoft SQL Server 2008 或更高版本
    • CUBRID 9.3 或更高版本
    • Oracle
    • ElasticSearch
    • Sphinx
    此外,Active Record 类支持以下NoSQL数据库 -
    • Redis 2.6.12 或更高版本
    • MongoDB 1.3.0 或更高版本
    在为单独的数据库表声明一个 Active Record 类(在我们的例子中为MyUser模型)后,您应该按照以下步骤从中查询数据 -
    • 使用 yii\db\ActiveRecord::find() 方法创建一个新的查询对象。
    • 构建查询对象。
    • 调用查询方法来检索数据。
    第 1 步- 以这种方式修改actionTestDb()方法。
    
    public function actionTestDb() {
       // return a single user whose ID is 1
       // SELECT * FROM `user` WHERE `id` = 1
       $user = MyUser::find()
          ->where(['id' => 1])
          ->one();
       var_dump($user);
       // return the number of users
       // SELECT COUNT(*) FROM `user`
       $users = MyUser::find()
          ->count();
       var_dump($users);
       // return all users and order them by their IDs
       // SELECT * FROM `user` ORDER BY `id`
       $users = MyUser::find()
          ->orderBy('id')
          ->all();
       var_dump($users);
    }
    
    上面给出的代码显示了如何使用 ActiveQuery 来查询数据。
    第 2 步- 转到http://localhost:8080/index.php?r=site/test-db,您将看到以下输出。
    活动记录
    按主键值或一组列值查询是一项常见任务,这就是 Yii 提供以下方法的原因 -
    • yii\db\ActiveRecord::findOne() - 返回单个 Active Record 实例
    • yi\db\ActiveRecord::findAll() - 返回 Active Record 实例的数组
    示例-
    
    public function actionTestDb() {
       // returns a single customer whose ID is 1
       // SELECT * FROM `user` WHERE `id` = 1
       $user = MyUser::findOne(1);
       var_dump($user);
       // returns customers whose ID is 1,2,3, or 4
       // SELECT * FROM `user` WHERE `id` IN (1,2,3,4)
       $users = MyUser::findAll([1, 2, 3, 4]);
       var_dump($users);
       // returns a user whose ID is 5
       // SELECT * FROM `user` WHERE `id` = 5
       $user = MyUser::findOne([
          'id' => 5
       ]);
       var_dump($user);
    }
    
  • 将数据保存到数据库

    要将数据保存到数据库,您应该调用yii\db\ActiveRecord::save()方法。
    第 1 步- 以这种方式修改actionTestDb()方法。
    
    public function actionTestDb() {
       // insert a new row of data
       $user = new MyUser();
       $user->name = 'MyCustomUser2';
       $user->email = 'mycustomuser@gmail.com';
       $user->save();
       var_dump($user->attributes);
       
       // update an existing row of data
       $user = MyUser::findOne(['name' => 'MyCustomUser2']);
       $user->email = 'newemail@gmail.com';
       $user->save();
       var_dump($user->attributes);
    }
    
    第 2 步- 转到http://localhost:8080/index.php?r=site/test-db,您将看到以下输出。
    将数据保存到数据库
    要删除单行数据,您应该 -
    • 检索 Active Record 实例
    • 调用yii\db\ActiveRecord::delete()方法
    第 1 步- 以这种方式修改actionTestDb()方法。
    
    public function actionTestDb() {
       $user = MyUser::findOne(2);
       if($user->delete()) {
          echo "deleted";
       } 
    }
    
    第 2 步- 在 Web 浏览器的地址栏中键入http://localhost:8080/index.php?r=site/test-db,您将看到以下输出。
    删除单行数据
    Step 3 - 例如,您还可以调用yii\db\ActiveRecord::deleteAll()方法来删​​除多行数据。
    
    public function actionTestDb() {
        MyUser::deleteAll('id >= 20');
    }