viernes, 24 de abril de 2015

Acceso a datos

Como se había mencionado anteriormente, los datos traídos de la base de datos se alamcenan en instancias Active Record, y cada fila del resultado de la consulta corresponde a una sola instancia Active Record. Se puede acceder a los valores de columna mediante el acceso a los atributos de las instancias Active Record, por ejemplo,

// "id" y "correo" son los nombres de columna de la tabla "cliente"
$cliente Cliente::findOne(123);$id $cliente->id;$correo $cliente->correo;

Es importante tomar en cuenta que no deberíamos re-declarar ninguno de los atributos de Active Record ya que los define Yii de manera automática.

Transformación de datos

Sucede a menudo que los datos que se ingresan y/o se muestran están en un formato diferente del utilizado en el almacenamiento de los datos en una base de datos. Por ejemplo, supongamos que la fecha de nacimiento de los clientes está almacenados como marcas de tiempo UNIX (aunque no es un buen diseño), mientras que en la mayoría de los casos lo ideal sería manipular las fechas en un formato más legible como 'yyyy/mm/dd' . Para lograr este objetivo, se pueden definir métodos de transformación de datos en la clase Active Record del cliente como se muestra a continuación:

class Cliente extends ActiveRecord{
    // ...

    public function getBirthdayText()
    {
        return date('Y/m/d'$this->birthday);
    }
    
    public function setBirthdayText($value)
    {
        $this->birthday strtotime($value);
    }
}

Ahora, en lugar de acceder a $customer->birthday (que nos mostraría una marca de tiempo), accedemos a $customer->birthdayText (que nos presentará la fecha en formato yyyy/mm/dd)

Recuperación de datos en matrices

Mientras que la recuperación de datos en términos de objetos Active Record es conveniente y flexible, no siempre es deseable cuando se tiene que traer una gran cantidad de datos debido al uso grande de memoria. En este caso, podemos recuperar datos utilizando arreglos PHP llamando asArray() antes de ejecutar un método de consulta:

// retorna todos los clientes
// cada cliente es retornado como un arreglo asociativo
$clientes Cliente::find()
    ->asArray()
    ->all();

Nota: Si bien este método ahorra memoria y mejora el rendimiento, está más cerca de la capa de abstracción de la base de datos y por ende se perderá la mayor parte de las características de Active Record. Una distinción muy importante radica en el tipo de datos de los valores de columna. Cuando retornan los datos en los casos de Active Record, los valores de columna serán asignados automáticamente en función de los tipos de columna reales; por otra parte, cuando retornan datos en arreglos, los valores de columna serán cadenas (ya que son el resultado de PDO sin ningún procesamiento), independientemente de sus tipos de columna reales.

Recuperación de datos en lotes

En la entrada Generador de Consultas (Query Builder), hemos visto que podemos utilizar la consulta por lotes para minimizar el uso de memoria al consultar una gran cantidad de datos de la base de datos. Podemos utilizar la misma técnica en Active Record. Por ejemplo,

// extrae 10 cliente de una sola vez
foreach (Cliente::find()->batch(10) as $clientes) {
    // $clientes es un arreglo de 10 o menos objetos Cliente
}

// extrae 10 clientes a la vez e itera uno por uno
foreach (Cliente::find()->each(10) as $cliente) {
    // $cliente es un objeto Cliente
}

// consulta en lotes con carga lenta
foreach (Cliente::find()->with('ordenes')->each() as $cliente) {
    // $cliente es un objeto Cliente
}



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

No hay comentarios.:

Publicar un comentario

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