Yii - 活動記錄 (Active Record)



活動記錄提供了一個面向物件的 API 用於訪問資料。一個活動記錄類與一個數據庫表相關聯。

Yii 為以下關係資料庫提供活動記錄支援:

  • MySQL 4.1 或更高版本
  • SQLite 2 和 3
  • PostgreSQL 7.3 或更高版本
  • Microsoft SQL Server 2008 或更高版本
  • CUBRID 9.3 或更高版本
  • Oracle
  • ElasticSearch
  • Sphinx

此外,活動記錄類還支援以下NoSQL 資料庫:

  • Redis 2.6.12 或更高版本
  • MongoDB 1.3.0 或更高版本

為單獨的資料庫表宣告活動記錄類(在本例中為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 - 訪問https://:8080/index.php?r=site/test-db,您將看到以下輸出。

Active Record

按主鍵值或一組列值查詢是一項常見任務,因此 Yii 提供了以下方法:

  • yii\db\ActiveRecord::findOne() - 返回單個活動記錄例項

  • yii\db\ActiveRecord::findAll() - 返回活動記錄例項陣列

示例 -

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 - 訪問https://:8080/index.php?r=site/test-db,您將看到以下輸出。

Save Data to Database

要刪除單行資料,應:

  • 檢索活動記錄例項

  • 呼叫yii\db\ActiveRecord::delete() 方法

步驟 1 - 修改actionTestDb() 方法如下。

public function actionTestDb() {
   $user = MyUser::findOne(2);
   if($user->delete()) {
      echo "deleted";
   } 
}

步驟 2 - 在 Web 瀏覽器的位址列中輸入https://:8080/index.php?r=site/test-db,您將看到以下輸出。

Delete Single Row Data

步驟 3 - 您還可以呼叫yii\db\ActiveRecord::deleteAll() 方法刪除多行資料,例如。

public function actionTestDb() {
    MyUser::deleteAll('id >= 20');
}
廣告