Bases de datos (DAO) en Yii

| 2013-04-29 | No hay comentarios »

DAO en Yii:

Yii provee un poderoso soporte para la programación con bases de datos. Construído sobre la extensión PHP de Obejotos de Datos (PDO), los Objetos de Acceso a Datos de Yii (DAO) habilitan el acceso a diferentes sistemas de administración de bases de datos (DBMS) en una interfaz uniforme simple. Las aplicaciones desarrolladas usando el DAO de Yii pueden ser fácilmente cambiadas para usar un DBMS diferente sin la necesidad de modificar el código de acceso a los datos. Los Registros Activos de Yii (AR), implementados con un enfoque ampliamente adoptado de Mapeo Objeto-Relacional, simplifican aún más la programación con bases de datos. Representado una tabla en términos de una clase y una fila como una instacia de esa clase, los AR de Yii eliminan la tarea repetitiva de escribir aquellas sentencias SQL que tratan principalmente con las operaciones CRUD (create, read, update and delete; crear, leer, actualizar, borrar).

Aunque el DAO y los AR de Yii pueden manejar casi todas las tareas relacionadas con la base de datos, aún puedes usar tus propias librerías en tu aplicación Yii. De hecho, el framework Yii esta cuidadosamente diseñado para ser usado en conjunto con otras librerías de terceros.

El DAO de Yii principalmente consiste de las siguientes cuatro clases:

  • CDbConnection: representa una conexión a una base de datos.
  • CDbCommand: representa una sentencia SQL a jecutar en la base de datos.
  • CDbDataReader: representa un flujo (solo de avance) de filas del resultado de una consulta.
  • CDbTransaction: representa una transacción de base de datos.

La forma del DNS depende del driver PDO de la base de datos en uso. En general, un DNS consiste del nombre del driver PDO, seguido por dos puntos (:), seguido por la sintaxis específica del driver. Mira laDocumentación PDO para una información completa. A continuación, una lista de los formatos DNS más comunmente utilizados:

  • SQLite: sqlite:/path/to/dbfile
  • MySQL: mysql:host=localhost;dbname=testdb
  • PostgreSQL: pgsql:host=localhost;port=5432;dbname=testdb
  • SQL Server: mssql:host=localhost;dbname=testdb
  • Oracle: oci:dbname=//localhost:1521/testdb

Ejecutando Sentencias SQL

Una vez establecida la conexión con la base de datos, las sentencias SQL pueden ser ejecutadas usandoCDbCommand. Se crea una instancia CDbCommand llamando a CDbConnetion::createCommand() con la sentencia SQL especificada:

$command=$connection->createCommand($sql);
// if needed, the SQL statement may be updated as follows:
// $command->text=$newSQL;

Una sentencia SQL es ejecutada a través de CDbCommand en una de las siguientes dos maneras:

  • execute(): ejecuta una sentencia SQL que no es consulta, como INSERTUPDATE y DELETE. Si es exitosa, devuelve el numero de filas afectadas por la ejecución.
  • query(): ejecuta una sentencia SQL que devuelve filas de datos, como SELECT. Si es exitosa, develve una instancia de CDbDataReader, a partid de la cual se recorrer el resultado de las filas de datos. Por conveniencia, están implementados un conjunto de métodos queryXXX(), los cuales devuelven directamente el resultado de la consulta.

Será arrojada una excepción si ocurre un error durante la ejecución de una sentencia SQL.

$rowCount=$command->execute();   // ejecuta una sentencia SQL sin resultados
$dataReader=$command->query();   // ejecuta una consulta SQL
$rows=$command->queryAll();      // consulta y devuelve todas las filas de resultado
$row=$command->queryRow();       // consulta y devuelve la primera fila de resultado
$column=$command->queryColumn(); // consulta y devuelve la primera columna de resultado
$value=$command->queryScalar();  // consulta y devuelve el primer campo en la primer fila

Obteniendo Resultados de la Consulta

Luego de que CDbCommand::query() genere la instancia de CDbDataReader, podemos recuperar filas del resultado llamando a CDbDataReader::read() de manera repetida. Podemos tambien usar un CDbDataReaderen un foreach de PHP para recuperar fila a fila.


$dataReader=$command->query();
// calling read() repeatedly until it returns false
while(($row=$dataReader->read())!==false) { ... }
// usando foreach para atravesar cada fila de datos
foreach($dataReader as $row) { ... }
// recuperando todos los datos de una vez en un único arreglo
$rows=$dataReader->readAll();

Usando Transacciones

Cuando una aplicación ejecuta unas pocas consultas, cada una leyendo y/o escribiendo información en la base de datos, es importante aseguarse que la base de datos no se quede sólo con algunas de las consultas llevadas a cabo. Para evitar esto, puede ser iniciada una transacción, representada en Yii como una instancia de CDbTransaction:

  • Comenzar la transacción.
  • Ejecutar consultas una a una. Ninguna actualización a la base de datos es visible al mundo exterior.
  • Consignar la transacción. Las actualizaciones se vuelven visibles si la transacción es exitosa.
  • Si una de las consultas falla, la transacción entera se deshace.

El anterior flujo de trabajo puede ser implementado usando el siguiente código:


$transaction=$connection->beginTransaction();
try
{
    $connection->createCommand($sql1)->execute();
    $connection->createCommand($sql2)->execute();
    //.... other SQL executions
    $transaction->commit();
}
catch(Exception $e) // se arroja una excepción si una consulta falla
{
    $transaction->rollBack();
}

Vinculando Parámetros

Para evitar ataques de SQL injection y para mejorar el rendimiento de sentencias SQL usadas repetidas veces, podemos “preparar” una sentencia SQL con marcadores de posición de parámetros opcionales, que son marcadores que serán reemplazados con los parámetros reales durante el proceso de vinculación de parámetros. El driver subyacente de la base de datos lo hará por nosotros. La vinculación de parámetros debe hacerse antes de que la sentencia SQL sea ejecutada.


// una SQL con dos marcadore de posición, ":username" and ":email"
$sql="INSERT INTO users(username, email) VALUES(:username,:email)";
$command=$connection->createCommand($sql);
// reemplaza el marcador de posición ":username" con el valor real de username
$command->bindParam(":username",$username,PDO::PARAM_STR);
// reemplaza el marcador de posición ":email" con el valor real de email
$command->bindParam(":email",$email,PDO::PARAM_STR);
$command->execute();
// inserta otra fila con un nuevo conjunto de parámetros
$command->bindParam(":username",$username2,PDO::PARAM_STR);
$command->bindParam(":email",$email2,PDO::PARAM_STR);
$command->execute();

Vinculando Columnas

Al recoger los datos del resultado de una consulta, podemos tambien vincular columnas con variables PHP para que sean automáticamente rellenadas con los datos apropiados cada vez que una fila es recogida.


$sql="SELECT username, email FROM users";
$dataReader=$connection->createCommand($sql)->query();
// vincular la 1er columna (username) con la variable $username
$dataReader->bindColumn(1,$username);
// vincular la 2da columna (email) con la variable $email
$dataReader->bindColumn(2,$email);
while($dataReader->read()!==false)
{
    // $username e $email contienen el nombre de usuaario y el email de la fila actual
}

Por más info ingresar a este link.

Acerca del autor: Rodrigo Paszniuk

Ingeniero Informático, amante de la tecnología, la música, el ciclismo y aprender cosas nuevas.

Posts Relacionados

  • Reportes gráficos en Yii
  • Backup en Yii
  • Manual intermedio de Yii framework (PHP)
  • Maestro-Detalle / Factura Compra en Yii – Parte II



SEGUÍNOS EN FACEBOOK


GITHUB