martes, 5 de mayo de 2015

Almacenamiento de datos

Active Record permite guardar fácilmente los datos en la base de datos mediante los siguientes pasos:

  1. Preparar una instancia Active Record
  2. Asignar los nuevos valores a los atributos de Active Record
  3. Llamar a yii\db\ActiveRecord::save() para guardar los datos en la base de datos.

Por ejemplo,

// insertar una nueva filda
$cliente = new Cliente();
$cliente->nombre 'Esteban';
$cliente->correo 'esteban@ejemplo.com';
$cliente->save();

// actualizar una fila existente
$cliente Cliente::findOne(123);
$cliente->correo 'esteban_nuevo@ejemplo.com';
$cliente->save();

El método save() permite insertar una nueva fila o actualizar una en particular, dependiendo del estado de la instancia Active Record. Si la instancia se crea a través del operador new, al llamar a save() se insertará una nueva fila. Si la instancia es el resultado de un método de consulta, al llamar a save() se actualizará la fila asociada con la instancia.

Para conocer cuál es el estado de la instancia  Active Record podemos hacerlo con la propiedad isNewRecord (por ejemplo: $cliente->isNewRecord), la cual devuelve los valores true o false.

Validación de datos

Debido a que yii\db\ActiveRecord se extiende de yii\base\Model, comparte las mismas características de validación de datos. Se puede declarar reglas de validación sobrescribiendo el método rules() y realizar la validación de datos llamando al método validate().

Cuando se llama al método save(), por defecto se llamará al método validate() de forma automática. Únicamente al pasar la validación, se guardarán los datos. Si existe error, el método devuelve false y con la propiedad errors se pueden recuperar los mensajes de error.

Consejo: Si estamos seguros de que los datos no necesitan validación podemos utilizar save(false) para omitir la validación.

Asignación Masiva
Es posible asignar valores a varios atributos a la vez de una instancia Active Record en una sola sentencia PHP, como se muestra a continuación. Debemos tener en cuenta que sólo los atributos del tipo safe pueden tomar valores de ésta manera.

$valores = [
    'nombre' => 'Carlos',
    'correo' => 'carlos@ejemplo.com',
];
$cliente = new Cliente();
$cliente->attributes $valores;
$cliente->save();

Actualizando contadores

En algunas ocasiones, tenemos un contador en nuestros registros, por ejemplo, para llevar el número de visitas de un cliente. Haciendo uso de updateCounters() podemos actualizar una o varias columnas de éste tipo.

$cliente Cliente::findOne(100);
// UPDATE `cliente` SET `contador_visitas` = `contador_visitas` + 1 WHERE `id` = 100
$cliente->updateCounters(['contador_visitas' => 1]);

Importante: Si utilizamos yii\db\ActiveRecord::save() para actualizar una columna del tipo contador, podemos terminar con un resultado inexacto, ya que es posible que el mismo contador sea actualizado por múltiples peticiones que están leyendo/grabando el mismo valor del contador.

Atributos sucios

Cuando se llama a save() para guardar una instancia Active Record, sólo los atributos sucios se graban. Un atributo se considera sucio si su valor se ha modificado desde que se cargó desde la base de datos o su guardado más reciente. Se debe tener en cuenta que que la validación de datos se realiza sin tener en cuenta si la instancia Active Record tiene atributos sucios o no.

Active Record mantiene de manera automática la lista de atributos sucios. Lo hace mediante el mantenimiento de una versión anterior de los valores de atributo y su comparación con la más reciente. Se puede llamar yii\db\ActiveRecord::getDirtyAttributes() para obtener los atributos que se encuentran actualmente sucios. También se puede llamar a yii\db\ActiveRecord::markAttributeDirty() para marcar explícitamente un atributo como sucio.

Si estuviéramos interesados en los valores de los atributos antes de su modificación más reciente, podemos llamar a getOldAttributes() o getOldAttribute().

Valores por defecto

Es posible que durante el diseño de nuestra base de datos, hayamos definido valores por defecto para algunas de las columnas de algunas de nuestras tablas. Bajo estas circunstancias, es posible que cuando presentemos un formulario Web, los campos asociados con alguna de las columnas que tienen valores por defecto, muestren dicho valor. Si así lo necesitamos, es posible que rellenar previamente el formulario Web para una instancia Active Record con estos valores predeterminados.

$cliente = new Cliente();
$cliente->loadDefaultValues();
// $cliente->xyz tomará los valores por defecto de la columna "xyz"

Actualización de varias filas

Para actualizar varias filas al mismo tiempo, debemos llamar a updateAll(), el cual es un método estático.

// UPDATE `cliente` SET `estado` = 1 WHERE `correo` LIKE `%@ejemplo.com`
Cliente::updateAll(['estado' => Cliente::ESTADO_ACTIVO], ['like''correo''@ejemplo.com']);

Del mismo modo, se puede llamar a updateAllCounters() para actualizar las columnas tipo contador de varias filas al mismo tiempo.

// UPDATE `cliente` SET `edad` = `edad` + 1
Cliente::updateAllCounters(['edad' => 1]);


Eliminación de datos

Para borrar una sola fila, primero debemos recuperar esa fila y llamar al método yii\db\ActiveRecord::delete().

$cliente Cliente::findOne(123);
$cliente->delete();

También podemos eliminar varias filas llamando a yii\db\ActiveRecord::deleteAll().

Cliente::deleteAll(['estado' => Customer::ESTADO_INACTIVO]);

Hay que ser cuidado al utilizar deleteAll, ya que podemos borrar toda la tabla si no especificamos alguna condición.



También te puede interesar:
Consulta de Datos
Acceso a Datos
Active Record (Registro Activo)

No hay comentarios.:

Publicar un comentario

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