bases datos symfony2

Crear una nueva tabla en una base de datos con Symfony2

 

Añadimos una nueva entidad en CruiseHunter/CrucerosBundle/Entity/Naviera.php

actualizamos los datos:

- php app/console doctrine:generate:entities CruiseHunter/CrucerosBundle/Entity/Naviera

 

- php app/console doctrine:generate:entities CruiseHunter/CrucerosBundle/Entity/Naviera

 

Cuidado. si creamos el fichero en minúsculas, al hacer el doctrine:generate nos va a generar uno en mayúsculas, y nos dará el dichoso error de que no se puede crear dos veces una clase con el mismo nombre.

Más datos importantes, la cabecera con ORM es importante para generar la tabla automáticamente en nuestra base de datos:

 

/**

 * CruiseHunter\CrucerosBundle\Entity\Naviera

 * @ORM\Table(name="naviera")

 * @ORM\Entity

 */

class Naviera

{

 

 

y, por último, debemos tener una variable key, tipo id:

 

    /**

     * @ORM\Id

     * @ORM\Column(type="integer")

     * @ORM\GeneratedValue(strategy="AUTO")

     */

    private $id;

 

 

Hasta aquí todo. Sólo nos queda generar la base de datos:

 

- php app/console doctrine:schema:update --force

Esto último lo que hace es revisar nuestro Entity, y comprobar que campos llevan un @ORM con un \Column asociado. Justamente este campo es el que el comando update usará para crear el campo en la base de datos. 

Por ejemplo:

 

    /**

     * @var string $descripcion

     * @ORM\Column(type="string",length=200)

     * 

     */

    private $descripcion;

    /**

     * @var string $barco

     * @ORM\Column(type="string",length=100)

     */

    private $barco;

    /**

     * @var string $enlace

     * @ORM\Column(type="string",length=200)

     */

    private $enlace;

 

eliminar una base de datos en Symfony2 / Doctrine2

eliminamos el php que contiene la definición de la tabla actual, por ejemplo:

rm src/CruiseHunter/CrucerosBundle/Entity/Crucero.php

Ejecutamos el comando:

sudo php app/console doctrine:schema:drop --force

Mas información:

http://www.doctrine-project.org/docs/orm/2.0/en/reference/tools.html sobre todo la sección 23.1.4. Command Overview

 

Y ya estamos en condiciones de volver a ejecutar:

sudo php app/console doctrine:schema:update --force

sin que nos de un error porque exista ya la clase, lo que suele indicar que hay un .php en Entities que no debería...

Bases de datos en Symfony2: Doctrine2

Me encanta aprender lenguajes nuevos y tecnologías nuevas a pesar de lo desesperante de algunos momentos en los que te encuentras atascado. Es el caso.

Trabajar con Bases de datos en Symfony2 es sencillo, casi divertido. Si ya tenemos creado el Bundle es tan fácil como lo siguiente (si no lo tenemos creado os recomiendo leer el primer post de este tutorial sobre symfony2, Hola Mundo en Symfony2, una pista: php app/console generate:bundle --namespace=Acme/StoreBundle)

Lo siguiente es asegurarnos de que los datos de configuración de nuestra base de datos son correctos (tipo de base de datos, password, puerto, ...). Si hemos seguido los pasos de instalación correctamente, lo más normal es que ya esté configurada, y el fichero app/config/parameters.ini contiene esos datos.

(i) Normalmente lo primero es crear una base de datos sobre la que podamos trabajar. En Symfony2 no es necesario, el propio framework puede hacerlo por nosotros:

php app/console doctrine:database:create

Ojo con los permisos, en ubuntu probablemente deberemos usar el comando "sudo" antes del comando anterior para poder ejecutarlo con permisos de superusuario.

(ii) Lo siguiente es crear una estructura para nuestra base de datos. Antes de ponernos a picar código es importante diseñar bien la aplicación, independientemente del lenguaje, framework o "bicho" que estemos usando para plasmar nuestros sueños sobre la pantalla.

En Symfony vamos a pensar en Entidades. Una entidad es básicamente una representación de un objeto de nuestra base de datos. Por ejemplo, si tenemos una tienda o un ecommerce, una entidad sería un producto, o un crucero por ejemplo si nos dedicamos al turismo. Así, la entidad sería Producto.php y Crucero.php respectivamente.

Una vez tengamos clara la estructura vamos a crear un directorio nuevo dentro del directorio de nuestra app src/NombredenuestraApp/NombredelBundle/Entity/Objeto.php

Por ejemplo: src/CruiseHunter/CrucerosBundle/Entity/Cruceros.php

El fichero seguirá este formato:

----------------------------------------------

 

<?php

// src/Acme/StoreBundle/Entity/Product.php

namespace CruiseHunter\CrucerosBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**

 * @ORM\Table(name="cruceros")

 * @ORM\Entity

 */

class Crucero

{

    /**

     * @ORM\Id

     * @ORM\Column(type="integer")

     * @ORM\GeneratedValue(strategy="AUTO")

     */

    protected $id;

    /**

     * @ORM\Column(type="string", length=100)

     */

    protected $nombre;

    /**

     * @ORM\Column(type="integer")

     */

    protected $precio;

    /**

     * @ORM\Column(type="string", length=100)

     */

    protected $descripcion;

}

----------------------------------------------

 

Una vez en este punto, quedaría plasmar esta estructura en nuestra base de datos. Pero, un momento, hasta ahora no hemos tenido que tirar del comando mysql ni tan siquiera abrir phpmyadmin... no será esta una excepción:

sudo php app/console doctrine:generate:entities CruiseHunter/CrucerosBundle/Entity/Crucero

Con esto acabamos de crear las Entidades, que se usarán, entre otras cosas, para crear las tablas que vamos a necesitar en la base de datos.

Cuidado con repetir este último comando porque nos dará un error de redeclaración de la clase Crucero (o la que sea en tu caso) y tendremos un problema ( soy un poco manazas, lo se :-( ).

(iii) Bueno, allá vamos:

sudo php app/console doctrine:schema:update --force

y tendremos una respuesta parecida a esto:

 

Updating database schema...

Database schema updated successfully! "1" queries were executed

 

Si todo ha ido bien, ahora tenemos unas bonitas tablas nuevas en nuestra base de datos reflejando esta estructura. Fácil, verdad? :-)

 

Veamos, error clásico, olvidar el <?php del inicio del documento. Resultado? Este:

 

  [RuntimeException]                                                                            

  Namespace "CruiseHunter\CrucerosBundle\Entity\Crucero" does not contain any mapped entities.  

 

Si nos encontramos con este dichoso error no os paséis horas y horas como yo buscando la solución. Lo más obvio, lo que nadie te dice al principio, olvida los config, routing, kernel, etc, etc... Fíjate si has olvidado el puñe***o <?php de declaración de inicio de un fichero php. Ale, de nada :-).

En el siguiente capítulo veremos como acceder a los datos almacenados en la base de datos.