miércoles, 22 de abril de 2015

Consulta de Datos

Después de haber declarado una clase Active Record,

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

podemos utilizarla para consultar datos de la tabla de base de datos correspondiente. El proceso se lo realiza normalmente en los tres pasos siguientes:

  1. Crear un nuevo objeto de consulta llamando al método yii\db\ActiveRecord::find();
  2. Construir el objeto de consulta llamando a cualquiera de los métodos de construcción de consultas;
  3. Llamar a un método de consulta para recuperar los datos en términos de instancias de Active Record.

A continuación algunos ejemplos:

// retorna un único cliente cuyo ID es 123
// SELECT * FROM `cliente` WHERE `id` = 123
$cliente Cliente::find()
    ->where(['id' => 123])
    ->one();

// retorna todos los cliente activos ordenados por su ID
// SELECT * FROM `cliente` WHERE `estado` = 1 ORDER BY `id`
$cliente Cliente::find()
    ->where(['estado' => Cliente::ESTADO_ACTIVO])
    ->orderBy('id')
    ->all();

// retorna el número de clientes activos
// SELECT COUNT(*) FROM `cliente` WHERE `estado` = 1
$conteo Cliente::find()
    ->where(['estado' => Cliente::ESTADO_ACTIVO])
    ->count();

// retorna todos los clientes en un arreglo de clientes
// SELECT * FROM `customer`
$clientes Cliente::find()
    ->indexBy('id')
    ->all();

En la parte anterior, $cliente es un objeto Cliente, mientras que $clientes (en plural) es un conjunto de objetos Clientes. Todos ellos se rellenan con los datos recuperados de la tabla cliente.

Puesto que yii\db\ActiveQuery se extiende de yii\db\Query, podemos utilizar todos los métodos de construcción de consultas y métodos de consulta descritos en la sección Generador de Consultas (Query Builder).

Es una tarea común consultar por los valores de la clave primaria o un conjunto de valores de columna, por lo que Yii ofrece dos métodos de acceso directo para este propósito:

  • yii\db\ActiveRecord::findOne(): devuelve una sola instancia Active Record con la primera fila del resultado de la consulta.
  • yii\db\ActiveRecord::findAll(): devuelve un conjunto de instancias de Active Record con todos los resultados de la consulta.


Ambos métodos pueden recibir en sus parámetros los siguientes formatos:

  • un valor escalar: el valor es tratado como el valor deseado de la clave primaria a ser buscado. Yii determinará automáticamente qué columna es la columna de clave primaria mediante la lectura de la información del esquema de base de datos.
  • un arreglo de valores escalares: el arreglo se trata como los valores de la clave primaria deseados que se buscarán.
  • un arreglo asociativo: las claves son los nombres de columna y los valores son los correspondientes valores de las columnas deseadas a ser buscados.

Por ejemplo:

// retorna un único cliente cuyo ID es 123
// SELECT * FROM `cliente` WHERE `id` = 123
$clienteCliente::findOne(123);

// retorna cliente cuyos ID son 100, 101, 123 o 124
// SELECT * FROM `cliente` WHERE `id` IN (100, 101, 123, 124)
$clientes Cliente::findAll([100101123124]);

// retorna un cliente activo cuyo ID is 123
// SELECT * FROM `cliente` WHERE `id` = 123 AND `estado` = 1
$cliente Cliente::findOne([
    'id' => 123,
    'estado' => Cliente::ESTADO_ACTIVO,
]);

// retorna todos los clientes inactivos
// SELECT * FROM `cliente` WHERE `estado` = 0
$customer Cliente::findAll([
    'estado' => Cliente::ESTADO_INACTIVO,
]);

Se debe tomar en cuenta que ni yii\db\ActiveRecord::findOne(), ni yii\db\ActiveQuery::one() añadirán LIMIT 1 a la sentencia generada. Si sabemos que la consulta va a retornar más de un registro, debemos añadirlo de manera explícita para mejorar el rendimiento, por ejemplo

Cliente::find()->limit(1)->one()

En lugar de utilizar los métodos de consulta, podemos sobrescribir la sentencia sql y obtener los datos en un Active Record. Para ello debemos llamar al método yii\db\ActiveRecord::findBySql() de manera similar a:

// retorna todos los clientes inactivos
$sql 'SELECT * FROM cliente WHERE estado=:estado';
$clientes Cliente::findBySql($sql, [':estado' => Cliente::ESTADO_INACTIVO])->all();

No debemos llamar a métodos adicionales luego de llamar a findBySql() pues serán ignorados.


También te puede interesar:
Acceso a 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.