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.
[tipexperto titulo = “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.[/tipexperto]
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.
[tipexperto titulo = “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.[/tipexperto]
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.
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
/** * @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
[tipexperto titulo = “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:[/tipexperto]
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.
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!
[…] de varios capítulos bien interesantes de Maycol sobre la vista y el controlador, hemos lanzado el capítulo 8 de la Guía de […]
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
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!
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
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 😉
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!
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
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
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…
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
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
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
Huascar al parecer no agregaste la anotación @ORM\Id a tu Entity
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
Muy buen tutorial. Esperando el de seguridad.
Saludos. 😀
¿Logró solucinarlo? hice los cambios que meciona Juan pero me sigue saliendo el error.
Saludos.
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
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.
[…] Capítulo 8 – Configurando nuestra base de datos – Juan Ardissone […]
Gracias por compartir
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.
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.
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.
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));
}
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.!
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?
Ok, ya lo resolví, los comandos tenian que ir dentro de la clase, nunca explicaste eso. Saludos.
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!!!
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!
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
Hola
Me queda la duda respecto a los tipos de datos, por ejemplo no me permite colocar VARCHAR
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”
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!
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¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
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