Yii - Active Record

O Active Record fornece uma API orientada a objetos para acessar dados. Uma classe Active Record está associada a uma tabela de banco de dados.

Yii fornece suporte Active Record para os seguintes bancos de dados relacionais -

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

Além disso, a classe Active Record suporta o seguinte NoSQL bancos de dados -

  • Redis 2.6.12 ou posterior
  • MongoDB 1.3.0 ou posterior

Depois de declarar uma classe Active Record (MyUser modelo no nosso caso) para uma tabela de banco de dados separada, você deve seguir estas etapas para consultar os dados dela -

  • Crie um novo objeto de consulta, usando o método yii \ db \ ActiveRecord :: find ().
  • Crie o objeto de consulta.
  • Chame um método de consulta para recuperar dados.

Step 1 - Modifique o actionTestDb() método desta forma.

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

O código fornecido acima mostra como usar ActiveQuery para consultar dados.

Step 2 - Vá para http://localhost:8080/index.php?r=site/test-db, você verá a seguinte saída.

Consultar por valores de chave primária ou um conjunto de valores de coluna é uma tarefa comum, é por isso que o Yii fornece os seguintes métodos -

  • yii\db\ActiveRecord::findOne() - Retorna uma única instância do Active Record

  • yi\db\ActiveRecord::findAll() - Retorna uma matriz de instâncias do 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);
}

Salvar dados no banco de dados

Para salvar dados no banco de dados, você deve chamar o yii\db\ActiveRecord::save() método.

Step 1 - Modifique o actionTestDb() método desta forma.

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 - Vá para http://localhost:8080/index.php?r=site/test-db, você verá a seguinte saída.

Para excluir uma única linha de dados, você deve -

  • Recupere a instância do Active Record

  • Ligar para yii\db\ActiveRecord::delete() método

Step 1 - Modifique o actionTestDb() método desta forma.

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

Step 2 - Tipo http://localhost:8080/index.php?r=site/test-db na barra de endereço do navegador da web, você verá a seguinte saída.

Step 3 - Você também pode ligar para o yii\db\ActiveRecord::deleteAll() método para excluir várias linhas de dados, por exemplo.

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