Clases/Objetos de Conexion Directa a tablas
De CidesaWiki
Symfony contiene una herramienta que agiliza la comunicación con la base de datos; esta es llamada [Propel], la misma genera clases en distintos lenguajes para manejar las diferentes tablas de la base de dados, en esta artículo analziaremos como trabaja y como nos puede ayudar:
Contenido |
Configurando/Ejecución Propel
Propel dentro de symfony trabaja con la información que contiene el archivo schema.yml, en el cual se coloca la información o estrucura de las tablas de la base de datos que queremos generar. El archivo schema.yml contiene información como la siguiente:
--- propel: _attributes: { noXsd: false, defaultIdMethod: none, package: lib.model } carecpro: codpro: type: VARCHAR size: 10 required: true codrec: type: VARCHAR size: 10 required: true fecent: type: DATE fecven: type: DATE id: type: INTEGER required: true autoIncrement: true
La estrucura del archivo .yml es llamada [YAML], y es la forma como el propel de symfony obtiene los parámetros de ejecución y generación de las clases. En el ejemplo anterior se definió una tabla llamada carecpro, que contiene los campos codpro, codrec, fecent, fecven y id, el cual le dirá a propel como crear la clase de comunicación con la tabla.
Luego de tener debidamente configurado el archivo .yml, se procede hacer el llamado de la función propel de symfony por consola:
NOTA: debes estar en el directorio raiz del proyecto.
# symfony propel-build-model
Esta función te indicará el nombre de la clase resultante y los archivos que fueron creado.
Clases y Archivos Generados
Luego de ejecutar la herramienta Propel, la misma genera los siguientes archivos/clases:
--lib ----model ------map (carpeta) --------CarecproMapBuilder.php ------om (carpeta) --------BaseCarecpro.php --------BaseCarecproPeer.php ------Carecpro.php ------CarecproPeer.php
- CarecproMapBuilder.php: Este archivo contiene la información necesaria para generar la tabla de forma dinámica en la base de datos. No es muy relevante para nuestro proyecto.
- BaseCarecpro.php: Este archivo es la clase base de la clase Carecpro.php. Este archivo contiene el codigo de conexion con la tabla de la base de datos. Este archivo no debe ser modificado ya que es generado automáticamente por el propel. Esta clase no puede ser instanciada (no se pueden generar objetos)
- BaseCarecproPeer.php: Este archivo es la clase base de la clase CarecproPeer.php, la cual contiene las funciones estáticas de comunicación con la tabla de la base de datos y la funciones generales de la tabla. Esta clase no puede ser instanciada (no se pueden generar objetos)
- Carecpro.php: Esta clase genera los objetos de datos con la tabla. Cada objeto de esta clase es equivalente a un registro de la tabla. De manera que mediante estos objetos podemos insertar, modificar o eliminar registros de la tabla sin necesidad de generar ninguna instrucción SQL. Esta clase puede ser modificada sin ningún problema. Propel genera esta clase para que le sean agregadas funciones por el usuario sin chocar con la estructura base de coneccion que contiene la clase BaseCarecpro.php
- CarecproPeer.php: Esta es igual a la clase BaseCarecproPeer.php (ya que hereda de ésta) pero aquí el usuario puede colocar sus funciones adicionales.
En conclusión la clases BaseCarecproPeer.php y BaseCarecpro.php son las que debe ser usadas y modificadas por el usuario, las demás son generadas por Propel y contiene el núcleo del código de conexión.
Funcionamiento de las clases generadas por Propel
Todas las clases generadas por propel funcionan de la siguiente forma:
- Funciones get: Los valores de los campos de cada registro pueden ser obtenidos con las funciones "get", por ejemplo para obtener el valor en el objeto del campo codpro debemos llamar a la función getCodpro, de la siguiente forma:
$codpro = Objeto->getCodpro();
- Funciones set: Se usa para insertar un valor en un campo. Por ejemplo para insertar un valor en el campo codpro de un registro (cada registro es un objeto de la clase) se debe ejecutar como sigue:
Objeto->setCodpro('valor');
- Función "save": esta función del objeto guarda el contenidos en los campos del objeto en al base de datos. Hay que tomar en cuenta que no hay diferencia para el usuario entre actualizar e insertar un registro nuevo. Por ejemplo:
// Creo un objeto nuevo, sin datos $objeto = new Carecpro(); // Le inserto datos a este objeto $objeto->setCodpro('codigo'); $objeto->setCodrec('codigo'); // Guardo la información $objeto->save();
Al ejecutar la función "save", el objeto identifica autamicamente que es un registro nuevo y realiza el sql necesario.
Por otro lado si..
// Esta funcion estática es una herramienta de busqueda de registros // en este caso se esta pidiendo que traiga la informacion del registro con clave primaria "1" // Esta información será devuelta en un objeto de la clase Carecpro $objeto = CarecproPeer::retrieveByPK('1'); // Modifico los datos de los registos $objeto->setCodpro('codigo'); $objeto->setCodrec('codigo'); // Guardo la información $objeto->save(); <pre> En este ultimo ejemplo el objeto determina que el registro ya existe y que solo debe realizar un update de los campos modificados (no de todos). Por ultimo si queremos eliminar un registro: <pre> $objeto->delete();
Por supuesto esta ultima funcion necesita que el objeto contenga un registro válido de la tabla.
- Funciones doSelect: la clase *Peer contiene funciones de búsqueda como el doSelect y doSelectOne, con los cuales podemos hacer busquedas dentro de las tablas. La diferencia entre doSelect y doSelectOne es que la primera devuelve todos los registro que concuerden con el criterio y la segunda solo el primer registro.
Por ultimo si desea conocer mas funciones de las clases de objetos y Peer puede verificar las clases bases de cada uno, la cuales contienen todo el código fuente y por ende las definiciones de las funciones, o en la ayuda de symfony en la sección del [modelo]
La clase Criterio
Esta es una clase de symfony que sirva para generar criterios de búsqueda en las tablas de la base de datos a través de las clase *Peer. Por ejemplo, digamos que queremos hacer una búsqueda por el codpro y codrec en la tabla carecpro, deberiamos proceder como sigue:
$c = new Criteria(); $c->add(CarecproPeer::CODPRO,'valor1'); $c->add(CarecproPeer::CODPRE,'valor2'); // Le pasamos en objeto criterio para que sepa que queremos traernos de esa tabla // la variable $objetos contiene un arreglo de objetos Carecpro con todos los registros resultantes. $objetos = CarecproPeer::doSelect($c);
Mas información en la página del symfony [[1]]