Active Record permite guardar fácilmente los datos en la base de datos mediante los siguientes pasos:
- Preparar una instancia Active Record
- Asignar los nuevos valores a los atributos de Active Record
- 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)