miércoles, 22 de abril de 2015

Active Record (Registro Activo)

Active Record proporciona una interfaz orientada a objetos para acceder y manipular los datos almacenados en bases de datos. Una clase Active Record está asociada con una tabla de base de datos, una instancia Active Record corresponde a una fila de esa tabla, y un atributo de una instancia de Active Record representa el valor de una columna en particular en la fila. En lugar de escribir sentencias SQL, podemos acceder a los atributos de Active Record y llamar a métodos Active Record para acceder y manipular los datos almacenados en las tablas de base de datos.

Por ejemplo, supongamos que Cliente es una clase Active Record que se asocia con la tabla de clientes y nombre es una columna de la tabla de clientes. Para insertar una nueva fila en la tabla Cliente escrbimos algo similar a:

$cliente = new Cliente();
$cliente->nombre 'Juan';
$cliente->save();


El código anterior es equivalente a usar la siguiente declaración SQL para MySQL, que es menos intuitiva, más propensa a errores, y podemos tener incluso problemas de compatibilidad si utilizamos otro tipo de base de datos:

$db->createCommand('INSERT INTO `cliente` (`nombre`) VALUES (:nombre)', [
    ':nombre' => 'Juan',
])->execute();

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

  • MySQL 4.1 o superior: via yii\db\ActiveRecord
  • PostgreSQL 7.3 o superior: via yii\db\ActiveRecord
  • SQLite 2 y 3: via yii\db\ActiveRecord
  • Microsoft SQL Server 2008 o superior: via yii\db\ActiveRecord
  • Oracle: via yii\db\ActiveRecord
  • CUBRID 9.3 o superior: via yii\db\ActiveRecord (Se debe tener en cuenta que debido a un error en la extensión PDO, valores ente comillas no funcionan adecuadamente, por lo que se requiere tanto el cliente como el servidor de CUBRID 9.3)
  • Sphinx: via yii\sphinx\ActiveRecord, requiere la extensión the yii2-sphinx
  • ElasticSearch: via yii\elasticsearch\ActiveRecord, requiere la extensión the yii2-elasticsearch


Además, Yii también admite el uso de Active Record con las siguientes bases de datos NoSQL:

  • Redis 2.6.12 o superior: vía yii\redis\ActiveRecord, requiere la extensión yii2-redis
  • MongoDB 1.3.0 o superior: vía yii\mongodb\ActiveRecord, requiere la extensión yii2-mongodb


Declarando Clases Active Record

Una clase Active Record se declara extendiendo yii\db\ActiveRecord. Debido a que cada clase Active Record se asocia con una tabla de base de datos, en esta clase se debe sobrescribir el método tableName() para especificar a qué tabla la clase está asociada.

En el siguiente ejemplo, declaramos una clase Cliente asociada a la tabla de base de datos cliente:

namespace app\models;

use yii\db\ActiveRecord;

class Cliente extends ActiveRecord{
    const ESTADO_INACTIVO 0;
    const ESTADO_ACTIVO 1;
    
    /**
     * @Retorna una cadena con el nombre de la tabla asociada a ésta clase ActiveRecord.
     */
    public static function tableName()
    {
        return 'cliente';
    }
}

Las instancias Active Record son consideradas como modelos. Por esta razón las colocamos bajo el nombre de espacio app\models.

Y puesto que, yii\db\ActiveRecord se extiende de yii\base\Model, hereda todas las características, tales como atributos, reglas de validación, serialización de datos, entre otros.

Conexión a Bases de Datos

De forma predeterminada, Active Record utiliza el componente de aplicación db como la conexión de base de datos para acceder y manipular los datos de la base de datos. El componente db se lo configura de manera similar a:

return [
    'components' => [
        'db' => [
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=localhost;dbname=testdb',
            'username' => 'demo',
            'password' => 'demo',
        ],
    ],
];

Si requerimos de una conexión de base de datos diferente, debemos sobrescribir el método getDb():

class Cliente extends ActiveRecord{
    // ...

    public static function getDb()
    {
        // utiliza el componente "db2"
        return \Yii::$app->db2;  
    }
}



También te puede interesar:
Trabajando con bases de datos
DAO - Database Access Objects (Objetos de acceso a base de datos)
Consulta de Datos

No hay comentarios.:

Publicar un comentario

Nota: sólo los miembros de este blog pueden publicar comentarios.