Yii - Registro activo

Active Record proporciona una API orientada a objetos para acceder a los datos. Una clase de registro activo está asociada con una tabla de base de datos.

Yii proporciona el soporte de Active Record para las siguientes bases de datos relacionales:

  • MySQL 4.1 o posterior
  • SQLite 2 y 3:
  • PostgreSQL 7.3 o posterior
  • Microsoft SQL Server 2008 o posterior
  • CUBRID 9.3 o posterior
  • Oracle
  • ElasticSearch
  • Sphinx

Además, la clase Active Record admite lo siguiente NoSQL bases de datos -

  • Redis 2.6.12 o posterior
  • MongoDB 1.3.0 o posterior

Después de declarar una clase de registro activo (MyUser modelo en nuestro caso) para una tabla de base de datos separada, debe seguir estos pasos para consultar los datos de ella:

  • Cree un nuevo objeto de consulta, usando el método yii \ db \ ActiveRecord :: find ().
  • Genere el objeto de consulta.
  • Llame a un método de consulta para recuperar datos.

Step 1 - Modificar el actionTestDb() método de esta manera.

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);
}

El código proporcionado anteriormente muestra cómo usar ActiveQuery para consultar datos.

Step 2 - Ir a http://localhost:8080/index.php?r=site/test-db, verá el siguiente resultado.

La consulta por valores de clave primaria o un conjunto de valores de columna es una tarea común, es por eso que Yii proporciona los siguientes métodos:

  • yii\db\ActiveRecord::findOne() - Devuelve una única instancia de Active Record

  • yi\db\ActiveRecord::findAll() - Devuelve una matriz de instancias de Active Record

Example -

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);
}

Guardar datos en la base de datos

Para guardar datos en la base de datos, debe llamar al yii\db\ActiveRecord::save() método.

Step 1 - Modificar el actionTestDb() método de esta manera.

public function actionTestDb() {
   // insert a new row of data
   $user = new MyUser();
   $user->name = 'MyCustomUser2';
   $user->email = '[email protected]';
   $user->save();
   var_dump($user->attributes);
   
   // update an existing row of data
   $user = MyUser::findOne(['name' => 'MyCustomUser2']);
   $user->email = '[email protected]';
   $user->save();
   var_dump($user->attributes);
}

Step 2 - Ir a http://localhost:8080/index.php?r=site/test-db, verá el siguiente resultado.

Para eliminar una sola fila de datos, debe:

  • Recuperar la instancia de Active Record

  • Llama a yii\db\ActiveRecord::delete() método

Step 1 - Modificar el actionTestDb() método de esta manera.

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

Step 2 - Tipo http://localhost:8080/index.php?r=site/test-db en la barra de direcciones del navegador web, verá el siguiente resultado.

Step 3 - También puede llamar al yii\db\ActiveRecord::deleteAll() método para eliminar varias filas de datos, por ejemplo.

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