Symfony

Framework PHP orientado a objetos

Configurando nuestra Base de Datos

En este capítulo entraremos al mundo de Doctrine usándolo dentro de nuestro proyecto para así tener ya los datos dinámicamente almacenados en nuestra base de datos y poder manipularlos.

Como ya lo habíamos hablado en el capítulo 1, Doctrine es un ORM (Object-Relational Mapping). Cuando hablamos de relaciones en conceptos de base de datos, estamos refiriéndonos a las tablas diciendo entonces que existe una vinculación entra las tablas y objetos. Al usar un ORM mapeamos cada tabla con objetos dentro de nuestras aplicaciones, por ejemplo si tenemos una tabla de personas en la base de datos, tendremos un objeto Persona en la aplicación que conoce cuales son sus campos, tipos de datos, índices, etc. logrando con esto que la aplicación conozca el modelo de los datos desde un punto de vista orientado a objetos, es decir representado con Clases y Objetos.

Doctrine nos permitirá, conociendo nuestras tablas como hablamos anteriormente, crear las sentencias SQL por nosotros ya que toda la información necesaria para crear estos queries se encuentra “mapeada” en código PHP.

Como si esto fuera poco, la mayor de las ventajas de contar con un ORM será que nos permite como desarrolladores, abstraernos de que motor de base de datos estemos usando para el proyecto y nos permitirá, con solo un poco de configuración, cambiar toda nuestra aplicación por ejemplo de una base de datos MySQL a PostgreSQL o a cualquier otra soportada por el framework Doctrine.

Configuración de la base de datos

Para configurar los datos de la conexión del servidor de base de datos se deberán ingresar los valores en el archivo app\config\parameters.ini dentro de las variables ya definidas:

  • database_driver = pdo_mysql
  • database_host = localhost
  • database_port =
  • database_name = blog
  • database_user = maestros
  • database_password = clavesecreta

Estos datos serán usados por Doctrine para conectarse al servidor y trabajar con la base de datos. No hay necesidad de ingresar el puerto si se está usando el que figura por defecto para la base de datos que usemos, para nuestro caso MySQL.

Una vez que ya tenemos configurada nuestra base de datos, podemos usar el comando “console” para decirle a nuestro proyecto que se encargue de crear la base de datos en el servidor ejecutándolo de la siguiente manera:

C:\wamp\www\Symfony>php app\console doctrine:database:create
Created database for connection named <comment>blog</comment>

Esto nos retornará un mensaje diciéndonos, si los permisos estaban correctos, que la base de datos blog fue creada. Podemos revisar ahora nuestra base de datos por medio del phpMyAdmin y veremos que la base de datos ya existe.

Nota

En caso de necesitar borrar la base de datos podemos usar el comando “doctrine:database:create –force”, donde tendremos que pasarle el parámetro especial –force para confirmar que ejecute la acción.

El concepto que suele ser muy utilizado en frameworks de este tipo es ir creando la base de datos desde la aplicación, es decir, que la aplicación se encargue de crear la base de datos, las tablas, relaciones, índices y los datos de ejemplo. Este concepto lo iremos ahondando durante estos capítulos.

Creando las tablas y conociendo las Entidades

Como ejemplo usaremos dos tablas para nuestro manual simplemente para ver como trabajar con ellas usando el framework. Crearemos una tabla de Artículos y una de Comentarios para tener como ejemplo el concepto ya bien conocido de un blog.

A continuación tenemos el SQL de las tablas con sus campos:

CREATE TABLE IF NOT EXISTS `articles` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) NOT NULL,
  `author` varchar(255) NOT NULL,
  `content` longtext NOT NULL,
  `tags` varchar(255) NOT NULL,
  `created` date NOT NULL,
  `updated` date NOT NULL,
  `slug` varchar(255) NOT NULL,
  `category` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `comments` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `author` varchar(255) NOT NULL,
  `content` longtext NOT NULL,
  `reply_to` int(11) NOT NULL,
  `article_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `IDX_A6E8F47C7294869C` (`article_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

Para crear estas tablas en la base de datos primeramente lo haremos en código PHP para que Doctrine conozca perfectamente las tablas para poder interactuar con ellas. Es aquí donde conocemos el concepto de las Entidades (Entities). Una entidad es la representación “orientada a objetos” de nuestras tablas, es decir que crearemos una clase por cada una de nuestras tablas. Para no tener que escribirlas a mano, Symfony nos provee un generador de Entidades que es invocado con nuestro comando console de la siguiente manera:

C:\wamp\www\Symfony>php app\console doctrine:generate:entity

Al darle enter nos preguntará el nombre que usaremos para nuestra entidad y hay que entender que sigue el siguiente formato: IdentificadorDelBundle:NombreEntidad. Para nuestro caso, y como ya vimos en los capítulos anteriores, nuestro identificador del Bundle es MDWDemoBundle y primero crearemos la entidad para nuestra tabla de artículos por lo tanto escribiremos lo siguiente:

The Entity shortcut name: MDWDemoBundle:Articles

Al darle enter nos preguntará que formato queremos usar para agregar los metadatos que mapearan a la tabla proponiéndonos [annotation]. Aceptaremos la propuesta presionando Enter

Configuration format (yml, xml, php, or annotation) [annotation]:

Luego ya nos empezará a preguntar cuales serán las columnas de nuestra tabla y por cada columna el tipo de dato que arriba nos deja como ejemplo cuales podemos elegir. En caso de que sea un tipo de datos que necesite longitud también nos la pedirá y cuando ya no queramos ingresar columnas simplemente daremos un enter dejando vacío el valor.

Nota

No será necesario ingresar el campo id de la tabla ya que Symfony lo creará automáticamente con la idea de ser usado como clave primaria autonumérica.

Una vez finalizada la carga de los campos, nos preguntará si queremos crear un repositorio vacío a lo que contestaremos SI para luego, como último paso preguntarnos si confirmamos la creación automática de la Entidad a lo que también diremos que SI:

Instead of starting with a blank entity, you can add some fields now.
Note that the primary key will be added automatically (named id).

Available types: array, object, boolean, integer, smallint,
bigint, string, text, datetime, datetimetz, date, time, decimal, float.

New field name (press <return> to stop adding fields): title
Field type [string]:
Field length [255]:

New field name (press <return> to stop adding fields): author
Field type [string]:
Field length [255]:

New field name (press <return> to stop adding fields): content
Field type [string]: text

New field name (press <return> to stop adding fields): tags
Field type [string]:
Field length [255]:

New field name (press <return> to stop adding fields): created
Field type [string]: date

New field name (press <return> to stop adding fields): updated
Field type [string]: date

New field name (press <return> to stop adding fields): slug
Field type [string]:
Field length [255]:

New field name (press <return> to stop adding fields): category
Field type [string]:
Field length [255]:

New field name (press <return> to stop adding fields):

Do you want to generate an empty repository class [no]? yes

Summary before generation

You are going to generate a "MDWDemoBundle:Articles" Doctrine2 entity
using the "annotation" format.

Do you confirm generation [yes]?

Entity generation

Generating the entity code: OK

You can now start using the generated code!

Una vez finalizado el generador, tendremos dos archivos creados dentro de la carpeta src\MDW\DemoBundle\Entity ya que como prefijo de nuestro nombre de Entidad usamos el identificador de nuestro Bundle (MDWDemoBundle). El primer archivo será nuestra entidad Articles.php y el otro será el repositorio de esa entidad ArticlesRepository.php del cual hablaremos en el siguiente capítulo.

Si revisamos el contenido de estos archivos podremos ver que es una Clase con el nombre Articles y que contiene como propiedades los datos que hemos cargado de las columnas de la tabla incluyendo sus métodos getters y setters. También podremos ver que la información que mapea los datos de la tabla se encuentra como parte de bloques de comentarios sobre cada propiedad usando el concepto de Anotaciones, concepto muy conocido en el lenguaje Java. Esta información será utilizada en runtime para conocer datos sobre la entidad. Comentemos algunos más importantes:

  • @ORM\Entity: Indica que esta tabla se comportará como una entidad, es decir que mapeará una tabla de la base de datos.
  • @ORM\Table: Doctrine usará el nombre de nuestra entidad para crear una tabla en la base de datos con el mismo nombre y esta anotación nos permitirá especificar un nombre diferente si agregamos el parametro name: @ORM\Table(name=”nombre_tabla”).
  • @ORM\Column: Indica que esta propiedad mapea una columna de la tabla y como argumentos recibe datos de la misma como por ejemplo el tipo de dato y el largo en el caso de ser string. Doctrine se encargará de crear estas columnas con el tipo de dato correspondiente para cada motor de base de datos
  • @ORM\Id: Indica que esta propiedad/columna será la Clave Primaria de la tabla
  • @ORM\GeneratedValue: Indica que este campo numérico se irá autoincrementando usando la estrategia que pasemos por parámetro. En este caso AUTO hará que elija la mejor forma según el motor de base de datos que usemos, por ejemplo si usamos MySQL creará un indice autonumérico mientras que si es PostgreSQL usará un dato de tipo SERIAL.
Ahora creemos la entidad para la tabla de comentarios
C:\wamp\www\Symfony>php app\console doctrine:generate:entity

  Welcome to the Doctrine2 entity generator

This command helps you generate Doctrine2 entities.

First, you need to give the entity name you want to generate.
You must use the shortcut notation like AcmeBlogBundle:Post.

The Entity shortcut name: MDWDemoBundle:Comments

Determine the format to use for the mapping information.

Configuration format (yml, xml, php, or annotation) [annotation]:

Instead of starting with a blank entity, you can add some fields now.
Note that the primary key will be added automatically (named id).

Available types: array, object, boolean, integer, smallint,
bigint, string, text, datetime, datetimetz, date, time, decimal, float.

New field name (press <return> to stop adding fields): author
Field type [string]:
Field length [255]:

New field name (press <return> to stop adding fields): content
Field type [string]: text

New field name (press <return> to stop adding fields): reply_to
Field type [string]: integer

New field name (press <return> to stop adding fields):

Una vez que tengamos estas 2 entidades creadas podemos probar crear las tablas en la base de datos con el siguiente comando:

C:\wamp\www\Symfony>php app\console doctrine:schema:create

Ahora revisando la base de datos con el phpMyAdmin podremos ver como ambas tablas fueron creadas por nuestro proyecto y nos daremos cuenta como Doctrine, por medio de nuestras Entidades, conoce perfectamente como crearlas.

Modificando la estructura de las tablas

Ahora que ya tenemos nuestras Entidades tenemos que crear la relación que existe entre ellas. Para este caso decimos que un Articulo puede llegar a tener varios comentarios relacionados, mientras que un comentario pertenece a un artículo específico, por lo que en la tabla de comentarios deberíamos agregar una Clave Foránea apuntando a la tabla de artículos. Para esto, agregaremos la siguiente propiedad con sus respectivos getter y setter a nuestra entidad Comment:

    /**
     * @ORM\ManyToOne(targetEntity="Articles", inversedBy="comments")
     * @ORM\JoinColumn(name="article_id", referencedColumnName="id")
     * @return integer
     */
    private $article;
    public function setArticle(\Mdw\BlogBundle\Entity\Articles $article)
    {
        $this->article = $article;
    }

    public function getArticle()
    {
        return $this->article;
    }

Con este código estamos definiendo una relación entre ambas tablas y nuevamente las anotaciones permiten a Doctrine especificar como se define la FK:

  • @ORM\ManyToOne: Esta anotación le dice que desde esta tabla de comentarios existe una relación de muchos a uno con la entidad Articles
  • @ORM\JoinColumn: Especifica las columnas que se usarán para hacer el join. Localmente se usará una campo article_id y en la tabla de referencia se usará la propiedad id
Con esto hemos modelado la FK desde el punto de vista de la entidad Comment, iremos a la entidad Articles a escribir la relación desde su punto de vista agregando el siguiente código
    /**
     * @ORM\OneToMany(targetEntity="Comments", mappedBy="article")
     */
    private $comments;
    public function __construct()
    {
        $this->comments = new \Doctrine\Common\Collections\ArrayCollection();
    }
    public function addComments(\Mdw\BlogBundle\Entity\Comments $comments)
    {
        $this->comments[] = $comments;
    }

    public function getComments()
    {
        return $this->comments;
    }

Agregando la propiedad $comments estamos creando la referencia a la otra tabla ya que un artículo puede tener varios comentarios usamos la anotación inversa a la que vimos anteriormente @ORM\OneToMany y podremos ver que agregamos un constructor que inicializa la propiedad con un objeto del tipo ArrayCollection, que nos permitirá que un artículo contenga varios comentarios para así poder obtenerlos todos a través del método getComments().

Con estas modificaciones realizadas volvamos a generar nuestras tablas, pero como ya hemos creado ambas tablas, ejecutemos primeramente para borrarlas el siguiente comando:

C:\wamp\www\Symfony>php app\console doctrine:schema:drop --force

Para luego volver a crearlas usando el comando ya conocido:

C:\wamp\www\Symfony>php app\console doctrine:schema:create

La otra manera de actualizar nuestras tablas, en caso de no poder o no querer borrarlas es usando el comando de update donde podemos ver la gran potencia que nos provee Doctrine enviando solo el SQL necesario para actualizar las tablas

C:\wamp\www\Symfony>php app\console doctrine:schema:update --force

Nota

En cualquiera de los tres casos doctrine:schema:create, doctrine:schema:drop y doctrine:eschema:update podemos usar el parámetro especial “–dump-squl” para que en lugar de ejecutar el SQL necesario solo nos lo muestre en la pantalla para poder controlarlo:
C:\wamp\www\Symfony>php app\console doctrine:schema:create --dump-sql
ATTENTION: This operation should not be executed in a production environment.

CREATE TABLE Articles (id INT AUTO_INCREMENT NOT NULL, 
title VARCHAR(255) NOT NULL, author VARCHAR(255) NOT NULL,
content LONGTEXT NOT NULL, tags VARCHAR(255) NOT NULL,
created DATE NOT NULL, updated DATE NOT NULL,
slug VARCHAR(255) NOT NULL, category VARCHAR(255) NOT NULL,
PRIMARY KEY(id)) ENGINE = InnoDB;

CREATE TABLE Comments (id INT AUTO_INCREMENT NOT NULL,
author VARCHAR(255) NOT NULL, content LONGTEXT NOT NULL,
reply_to INT NOT NULL, PRIMARY KEY(id)) ENGINE = InnoDB

C:\wamp\www\Symfony>php app\console doctrine:schema:update --dump-sql

ALTER TABLE comments ADD article_id INT DEFAULT NULL;
ALTER TABLE comments ADD CONSTRAINT FK_A6E8F47C7294869C FOREIGN KEY (article_id)
 REFERENCES Articles(id);
CREATE INDEX IDX_A6E8F47C7294869C ON comments (article_id)

C:\wamp\www\Symfony>php app\console doctrine:schema:drop --dump-sql

ALTER TABLE comments DROP FOREIGN KEY FK_A6E8F47C7294869C;
DROP TABLE articles;
DROP TABLE comments

Resumen Final

Como vemos, el framework Doctrine, al tener los datos de la base de datos y de las tablas, nos proporciona un soporte muy potente para trabajar con ellas y eso que solo hemos visto la parte de creación, borrado y modificación de tablas. En los siguientes capítulos trabajaremos manipulando los datos de las tablas y le proporcionaremos aún más información a nuestras entidades para ayudarnos a validar los datos ingresados en nuestros campos.

Siguiente capítulo: Manipulando datos con Doctrine

Juan ArdissoneJuan Ardissone para Maestros del Web.
Agrega tu comentario | Enlace permanente al artículo

Síguenos en: Twitter @maestros | Facebook Fan page

36 comentarios

Comentarios

  1. Toni

    Acabo de empezar las practicas de empresa y me han tirado al ruedo junto a mi compañero con el symfony2, con conocimientos de php, pero sin ninguna explicacion ni orientacion de su funcionamiento, gracias a este tutorial, no me estoy chupando 600 paginas de manual oficial…. :S sigue asi! yo te seguiré de cerca! Gracias por el aporte! Sencillo y claro!

    1. Diego

      Hola @Toni, yo hace poco termine las practicas y ahora me encuentro de planta, plantee la idea de crear un aplicación de inventario y esta opción de Symfony2 como FW me pareció genial. Yo creo que podríamos estar en contacto y ayudarnos más adelante. @diferrev

  2. Javier Ugalde

    Excelenteee! poco a poco voy entendiendo como funciona cada elemento de symfony gracias a la ayuda de Juan y Maycol… enhorabuena! un abrazo!!!

    Solo se me generó una duda en este articulo, y es en la parte de modificar la estructura de la tabla.

    El codigo que indicas que hay que agregar en los respectivos archivos de entidades (articles.php y comments.php), lo puedo agregar al final del archivo? es decir, en cualquier parte de cada archivo? o debe ir por convención al principio?

    Saludos y gracias de antemano por tan excelente apoyo!

    1. Javier, no hay que olvidar que los archivos articles.php y comments.php son simplemente Clases en PHP. Una clase está compuesta por lo general por las propiedades, construtures y métodos (incluyendo los getters y setters). Por lo general la convención es en ese orden pero en realidad no hay inconveniente en cambiar el orden de los métodos. Espero haberte ayudado con la duda :-)

    2. En efecto como te indica Juan, los getters y setters por estándar van en dicho orden, pero realmente no importa el orden final, también puedes añadir tus propios getters y setters o modificar los originales, pero ten en cuenta que ello afecta el comportamiento al insertar/editar.
      Con respecto a los metadatos “@XXXX” lo mismos deben de ir en la cabecera de los bloques PHPDoc, también tienes la opción de usar YAML, XML o Código PHP, pero francamente el uso de Metadatos es limpio y te permite tener todo en un sólo lugar, y es lo que utilizaremos en el resto de la guía para lo relacionado con Doctrine2 y en el capítulo de Bundles de Terceros, saludos ;-)

  3. Daniel

    Excelente aporte Juan! creo que a partir de aqui se pone un poco mas densa la historia pero todo se aprende con mucha practica! Asi que a practicar!!!

    Muchas Gracias!

  4. Diego Reyes

    Hola Juan, hoy probando esta parte del capitulo, al ejecutar el comando “doctrine:schema:create” me salta un error de “No Metadata Classes To Process”, ¿A qué se debe esto? . Espero me aclare esta inquietud y como solucionarlo.

    Gracias

    1. Hola Diego.
      Fijate si la importación con la cláusula use se está haciendo así “use Doctrine\ORM\Mapping as ORM;” y que annotations hagan referencia al ORM: @ORM\Column(name=”id”, type=”integer”).
      Veo que hay muchas personas con este mismo inconveniente en el grupo de google

    2. Eduardo

      ¿Logró solucinarlo? hice los cambios que meciona Juan pero me sigue saliendo el error.

      Saludos.

    3. Hola Eduardo, debería ser algo de los annotations. Al buscar veo muchas personas hablando del tema, puedes ir probando los casos a ver cual pueda ser el tuyo. https://www.google.com/search?q=doctrine%3Aschema%3Acreate+%22No+Metadata+Classes+To+Process%22&ie=utf-8&oe=utf-8&client=ubuntu&channel=fs.
      Avísanos si lo haz logrado. Recuerda borrar la cache también por las dudas

    4. Logre solucionar el error comentado, el problema era en la configuración de Doctrine, en el archivo app/config/config.yml hice los siguientes cambios:

      # auto_mapping: true
      mappings:
      AplicacionMiBundle: { type: annotation, dir: Entity/ }

      Saludos.

    5. Gracias por compartir :-)

  5. Miguel

    Hola Juan
    Ya leí la parte donde dices que el concepto que suele ser muy utilizado en frameworks de este tipo es ir creando la base de datos desde la aplicación. Pero y si ya yo tengo mi base de datos creada con todas las relaciones pertinentes. ¿Podría generar de alguna forma las clases para cada tabla? O tendría que hacer todo este proceso de forma manual.
    Bueno de todas formas gracias por esta clase y todas las otras y por la sencilles con la que explicas las cosas…

    1. Miguel efectivamente lo puedes hacer. Doctrine te permite crear desde la aplicación la base de datos o crear desde la base de datos tus objetos. Para esto usas el comando doctrine:mapping:import te dejo la documentación http://symfony.com/doc/current/cookbook/doctrine/reverse_engineering.html

    2. miguelTA

      si efectivamente hace la importacion de la BD a doctrine pero bueno me salio un poco diferente al tutorial las clases articulo y comentario. pongo la parte de la relacion:
      comments:
      /**
      * @var Articles
      *
      * @ORM\ManyToOne(targetEntity=”Articles”)
      * @ORM\JoinColumns({
      * @ORM\JoinColumn(name=”article_id”, referencedColumnName=”id”)
      * })
      */
      private $article;
      /**
      * Set article
      *
      * @param MDW\DemoBundle\Entity\Articles $article
      */
      public function setArticle(\MDW\DemoBundle\Entity\Articles $article)
      {
      $this->article = $article;
      }

      /**
      * Get article
      *
      * @return MDW\DemoBundle\Entity\Articles
      */
      public function getArticle()
      {
      return $this->article;
      }
      pero no se si lo que realize esta bien.!

  6. Saludos Juan primeramente felicitaciones por esta iniciativa. Vengo siguiendo los capitulos pero en este me ha dado unos errores a la hora de crear la relacion en las tablas copie el codigo como lo colocaste pero me da este error de clave primaria

    ” No identifier/primary key specified for Entity ‘MDW\DemoBundle\Entity\Comments’. Every Entity must have an identifier/primary key. ”

    esto es cuando ejecuto el comando php app/console doctrine:schema:drop –force
    estoy desde ubuntu, saludos

    1. Huascar al parecer no agregaste la anotación @ORM\Id a tu Entity

  7. Miguel

    Hola Juan

    Ya vimos los ejemplos anteriores de la base de datos pero las relaciones son 1-M o M-1. En caso de que fuese M-M cómo quedaría la modificación en las entidades. Sería bueno ver un ejemplo de ello.

    Saludos

    1. Miguel, para las relaciones M-M tienes que colocar dos 1-M contra tu Entity intermedio. También puedes mirar la documentación oficial de Doctrine para ver los ejemplos http://docs.doctrine-project.org/projects/doctrine-orm/en/2.1/reference/association-mapping.html#many-to-many-unidirectional

  8. Muy buen tutorial. Esperando el de seguridad.

    Saludos. :D

  9. rob

    Buenas, enhorabuena una vez más por el tuto de symfony2, ya que está bastante bien explicado; pero una cosa no me queda clara.
    Hace tiempo estuve trabajando con otro FW (CakePhp) que me parece que es algo más sencillo de aprender que Symfony (seguramente no tan potente como este último, eso no lo dudo), y creo recordar que las relaciones entre tablas también se generaban desde la consola; pero según lo que tu explicas aquí, en Symfony2 se hace de forma manual ?¿.

    Gracias por la guía.

    1. rob, tienes dos formas basicamente. Si quieres crear los entities desde la base de datos con un comando de consola lo haces y si es al revés como lo estamos haciendo aquí primeramente creando los entities y de ahí la base de datos lo haces a mano ya que el generador todavía no tiene esa opción.

  10. Luciano

    Buenas, muy buen tutorial. Te hago una consulta, ¿es posible crear relaciones en las entidades sin trasladarlas a las tablas? Mi problema es que no puedo modificar la base de datos, y en la misma no existen claves foraneas, solo primarias (la unica solucion que encontre hasta ahora es usar native queries, con iiner joins).
    Saludos.

    1. Hola Luciano.

      Hice la prueba eliminando del mysql del ejemplo la FK y sin problema sigue funcionando. Hice este ejemplo en el action.


      public function listarAction()
      {
      $em = $this->getDoctrine()->getEntityManager();

      $articulos = $em->getRepository('MDWDemoBundle:Articles')->findAll();

      foreach($articulos as $a)
      {
      print_r($a->getComments());
      }

      return $this->render('MDWDemoBundle:Articulos:listar.html.twig', array('articulos' => $articulos));
      }

  11. Neko

    Estimado juan cuando agrego el codigo para crear las relaciones entre las tablas, y ejecuto el update (php app\console doctrine:schema:update –force)
    me tira el siguiente error:
    Parse error: syntax error, unexpected T_PRIVATE in F:\xampp\htdocs\Symfony\src\d
    g\DemoBundle\Entity\Articles.php on line 5

    Esa es la linea donde se declara la variable: private $comments;

    como soluciono esto?

    1. Neko

      Ok, ya lo resolví, los comandos tenian que ir dentro de la clase, nunca explicaste eso. Saludos.

  12. José Manuel

    Hola,
    en primer lugar gracias a ambos autores por escribir este estupendo manual de iniciación.
    En este capítulo me surge una duda. Cuando estamos añadiendo las relaciones 1-M a la clase, escribes …setArticle(\Mdw\BlogBundle\…. He de suponer que este bundle (BlogBundle) ya lo tendríamos que haber creado ¿no? ¿O te estás refiriendo al que creaste en el capítulo de los bundle? Porque en ese caso si que me estoy liando ya…

    De nuevo muchísimas gracias por este manual!!!

  13. Hola a todos. Oye lo primero felicidades por esta guía, que está muy pero que muy currada.

    Bien, tengo una duda. Tengo una pequeña aplicación con un montón de tablas, y algunas que hacen de puente entre otras, por ejemplo: Una tabla con peces, otra tabla con las puestas (cruce de dos peces para obtener descendencia) y una tabla imagenes.

    Como todas las imagenes ya sean de peces, gatos o puestas o lo que sea van en esa misma tabla, necesito una tabla que me relacione los peces con las imagenes, otra que relacione las puestas con sus imagenes y así sucesivamente…

    Pues bien, no me queda muy claro como hacerlo con Symfony.

    Agradecería una pequeña ayudita!

    Thanks so much!

  14. jhon eduard izquierdo

    Hola estoy siguiendo tu manual y esta super bueno para la pregunta de Manuel al principio de este capitulo se trabaja con DemoBundle y en para la relacion de tablas ya se habla de BlogBundle son dos diferentes asi que se crea un bundle nuevo y agradecer al amigo NEKO por su solucion por que no habia visto la parte de la clase. GRACIAS

  15. desi

    Hola
    Me queda la duda respecto a los tipos de datos, por ejemplo no me permite colocar VARCHAR

  16. Isidro

    Estoy encantado con tu toturial, de verdad que ha sido de mucha ayuda solo que encontré 2 errores en la última nota en las palabras “doctrine:eschema:update” y “–dump-squl”

  17. Hola! estupenda guía y gracias por la información, me gustaría saber si es posible solapar dos bases de datos como estas para un proyecto de universidad. Gracias!

  18. Pier

    Holas primero muchas gracias por el tutorial, bueno he tenido problemas en la parte de insercion de campos. me sale el siguiente error

    Parse error: syntax error, unexpected T_PUBLIC in C:\xampp\htdocs\Symfony\src\MDW\DemoBundle\Controller\ProductController.php on line 5

    no tengo idea copmo solucionarlo es la parte donde esta public function y el action, porfa ayuda¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡

  19. marta

    Antes de nada enhorabuena por el tutorial, me estáis ayudando un montón!
    Tengo un problema quizás me podáis ayudar.
    Tengo una base de datos la cual no tiene FK y no puedo modificar, he leído la contestación de que podía añadir las relaciones en las entity sin más. Pero parece ser que no las reconoce, he seguido el ejemplo del action(adaptado a mis tablas) y no reconoce las relaciones, es decir me mostraría los artículos pero no los comentarios.
    Creo que es porque no reconoce los metadatos, dado que si en vez del nombre de la tabla pongo una inexistente reacciona de la misma manera.
    He de ejecutar un comando tras escribir las relaciones? o basta con guardarlos?

    De antemano muchas gracias, espero me puedan ayudar

Los comentarios de este post están cerrados. Si quieres seguir la discusión, debatir, criticar, sugerir o expandir el tema te invitamos a hacerlo en tu propio blog, en twitter o donde puedas publicar. No olvides enlazar a este post para que sigamos la conversación y se genere un trackback.