Implementaci贸n del modelo usando Doctrine y Symfony CLI

7/17

Lectura

Creando las entidades

Lo primero que debemos hacer es escribir la configuraci贸n b谩sica que necesitaremos para que nuestra aplicaci贸n pueda interactuar con una base de datos.

Abre el archivo .env en tu editor favorito.

Te encontrar谩s con algo como:

Ejemplo del archivo

Nota que hay una l铆nea donde figuran los datos para conectarse a una base de datos (DATABASE_URL=...).

Reemplaza esa l铆nea por:

DATABASE_URL=mysql://homestead:[email protected]:3396/homestead?serverVersion=5.7

Para continuar vamos a trabajar desde adentro de la m谩quina virtual.

Vamos a iniciarla con:

vagrant up

Y luego:

vagrant ssh

cd code

Y aqu铆 comienza la magia 馃槂

Magic

En la clase anterior aprendiste c贸mo interactuar con el int茅rprete de comandos de Symfony (usarlo es una palabra un poco fuerte a煤n).

Veamos ahora un uso muy importante: vamos a crear nuestra primera entidad.

Para ello utiliza el comando

php bin/console make:entity

Lo que viene a continuaci贸n es una serie de preguntas que te realizar谩 Symfony para ayudarte a crear el modelo de datos.

Vamos a repasar el modelo de datos que hab铆amos visto en la clase 2.

La primera entidad que vamos a crear ser谩 el oferente:

Ejemplo de la entidad en terminal

Ahora veamos qu茅 es exactamente lo que hizo el framework.

Si lees con atenci贸n ver谩s que se actualiz贸 el archivo src/Entity/Company.php.

Al abrirlo encontrar谩s algo como esto:

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\CompanyRepository")
 */
class Company
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $name;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $email;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getName(): ?string
    {
        return $this->name;
    }

    public function setName(string $name): self
    {
        $this->name = $name;

        return $this;
    }

    public function getEmail(): ?string
    {
        return $this->email;
    }

    public function setEmail(string $email): self
    {
        $this->email = $email;

        return $this;
    }
}

Potente, 驴cierto? jeje鈥 y esto reci茅n empieza 馃槂

Nota como se utiliza muy extensamente la @ dentro de los comentarios.

Esto no es para nada accidental. Se trata de una herramienta llamada annotations.

Mediante ellos es posible dar indicaciones a otras herramientas.

En nuestro caso, mucho de la configuraci贸n de nuestro proyecto estar谩 escrita de este modo.

Por ejemplo, si te fijas la definici贸n de la propiedad $name:

/**
     * @ORM\Column(type="string", length=255)
     */
    private $name;

Ver谩s que el tipo de datos y la longitud est谩n especificadas aqu铆.

Esta informaci贸n vendr谩 muy bien pronto, conf铆a en m铆 馃槂

Te dejo de tarea armar el resto de las entidades.

隆Excelente! Todo esto est谩 genial, pero鈥 驴d贸nde se guardar谩 toda esta informaci贸n?

La base de datos sigue intacta鈥 falta algo, 驴cierto?

Cierto.

Para que todo esto tenga sentido necesitamos crear la estructura que mapee nuestras clases a la base de datos.

Tenemos dos opciones para ello:

Un comando que genera la estructura de la base de datos desde 0:

php bin/console doctrine:schema:create

O bien un comando que genere una migraci贸n (que luego tendremos que ejecutar):

php bin/console make:migration

Ambos dar谩n el mismo resultado (en este contexto), sin embargo, es una buena pr谩ctica realizar todas las operaciones de modificaci贸n de la base de datos a trav茅s de migraciones, de esa forma es muy simple reconstruir todo en caso de ser necesario, por ejemplo, al pas谩rselo a otro desarrollador.

Si abres el archivo generado (lo encontrar谩s dentro del directorio src/Migrations/) ver谩s el c贸digo generado para crear la base de datos.

Una vez hayas terminado de definir todas las entidades debes impactar esos cambios en la base de datos. Para ello puedes usar el comando php bin/console doctrine:migrations:migrate.

El int茅rprete te preguntar谩 si confirmas impactar los cambios (ya que potencialmente podr铆an destruir datos) y, una vez lo hayas hecho, te mostrar谩 las sentencias SQL a medida que las ejecuta.

Al finalizar podr谩s ver c贸mo qued贸 tu base de datos ingresando a la consola de MySQL escribiendo

mysql
use homestead
show tables

Lo interesante de usar las migraciones es que podr谩s ir realizando cambios incrementales, de modo que, a medida que avances en la comprensi贸n del problema, ir谩s dando m谩s y m谩s detalles a la definici贸n de tu modelo de datos y, mediante este mecanismo, podr谩s evolucionar tu base de datos consecuentemente.

En el caso de la entidad Offer encontrar谩s que tiene una propiedad que refiere a otra entidad: el owner (La compa帽铆a a la que pertenece la oferta).

Para estos casos Doctrine dispone de una sintaxis particular y escribirla a trav茅s del comando make de Symfony es bastante f谩cil.

El tipo de datos del campo owner debes definirlo como relation:

Ejemplo en terminal

El tipo de relaci贸n es ManyToOne de modo que una oferta se relaciona con una empresa y una empresa puede tener muchas ofertas.

Cuando hayas terminado de armar la entidad Offer no olvides ejecutar el comando php bin/console make:migration para crear la nueva migraci贸n y php bin/console doctrine:migrations:migrate para actualizar tu base de datos.

En la pr贸xima clase desarrollaremos nuestras primeras pantallas, 隆no te la pierdas!

Aportes 16

Preguntas 2

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesi贸n.

Con respeto siempre por delante, pero menuda porqueria de curso. El formato en texto ya de por si es peor al de video, pero si ademas de eso no mantienen un buen orden coherente pues mal vamos. Te dice 鈥淭e dejo de tarea armar el resto de las entidades.鈥 pero donde narices esta eso bien explicado??. Lo unico que hay es en el tercer video una idea general del proyecto, pero no te aclara bien las entidades ni las columnas que debe tener cada cual. Sinceramente si fuese @platzi tiraria este curso a la basura y crearia uno en condiciones como se merece un Framework tan potente como Symfony. Dadle amor al comentario a ver si llamamos su atencion y nos hacen caso.

Con todo respeto, pero creo que los tutoriales que puedo encontrar en la red estan mejor que este curso, por primera vez me decepciona platzi

El peor formato que puede existir

El modelo que se muestra en esta secci贸n https://platzi.com/clases/1901-symfony-framework-2020/29475-analisis-del-modelo-de-datos/ es distinto al que aparece aqu铆, espero que luego se arregle.

Recomendaci贸n
Ya termin茅 todo el curso y en esta clase debes definir 煤nicamente las entidades Company y Offer.
En la clase 9 se crea la entidad User
En la clase 11 se crea la entidad Applicant
Por ahora no hay necesidad de ser muy creativos, las entidades b谩sicas deben quedar as铆:
Company
name - string
email - string
Offer
name - string
owner - relation
.
Durante otras clases se adicionan un par de campos, pero no les dar茅 Sploilers, as铆 es suficiente.

Vale鈥 esta clase si me decepcion贸 un poco, realmente lo que no me gust贸 es que no te dice realmente qu茅 columnas debo crear, claro, yo las puedo deducir con base en el modelo explicado en la clase 3, pero igual y el profesor usa diferentes columnas.

Como sea, si les sale el error:

The metadata storage is not up to date, please run the sync-metadata-storage command to fix this issue. 

Lo que tienen que hacer es ir a su .env y en la definici贸n de la base de dato, al final donde dice 5.7 lo cambian por:

mariadb-10.4.16

Si estas usando MySQL y no MariaDB deber铆a funconar con:

mysql-5.7

Aqu铆 dejo la informaci贸n:

https://stackoverflow.com/questions/62412312/symfony-makemigration-the-metadata-storage-is-not-up-to-date-please-run-the

Homestead me cre贸 la DB con el password 鈥渟ecret鈥 y no 鈥渉omestead鈥.
En la documentaci贸n indica que ese es el password por defecto (ver: https://laravel.com/docs/7.x/homestead#connecting-to-databases).

As铆 que la l铆nea de conexi贸n que funcion贸 para mi es:
DATABASE_URL=鈥渕ysql://homestead:[email protected]:3306/homestead?serverVersion=5.7鈥

(la estructura es DATABASE_URL=鈥渕ysql://db_user:[email protected]:3306/db_name鈥)

A alguien m谩s les sale este error al ejecutar php bin/console doctrine:schema:create?

Jesus esta primera imagen no se entiende nada !

(

Tal como un amigo aqui, estoy trabajando sobre mi propio sistema en linux Mint, us茅 mysql 5.7 y para la configuraci贸n de env y su conexi贸n con la db us茅 esto 馃槈

DATABASE_URL=鈥渕ysql://usuarioDB:contrase帽[email protected]:3306/nombreDB?serverVersion=5.7鈥

A mi me ha funcionado (Symfony 5.1.6) haciendo:

php bin/console doctrine:database:create
php bin/console make:migration
php bin/console doctrine:migrations:migrate

Para los que trabajan fuerea de las maquinas virtuales , a mi me funcion贸 que en lugar de 127.0.0.1:3306 usen solo 127.0.0.1 entonces quedar铆a algo asi DATABASE_URL=mysql://db_user:[email protected]/db_name?serverVersion=5.7 , suponiendo que en Windows a veces no se tiene contrase帽a DATABASE_URL=mysql://[email protected]/db_name?serverVersion=5.7

Espero les funcione!

Me aparece este error

php bin/console doctrine:schema:create

 !                                               
 ! [CAUTION] This operation should not be        
 !           executed in a production            
 !           environment!                        
 !                                               

 Creating database schema...


In ToolsException.php line 34:
                                                
  Schema-Tool failed with Error 'An exception   
  occurred in driver: SQLSTATE[HY000] [2002] C  
  onnection refused' while executing DDL: CREA  
  TE TABLE company (id INT AUTO_INCREMENT NOT   
  NULL, name VARCHAR(255) NOT NULL, email VARC  
  HAR(255) NOT NULL, PRIMARY KEY(id)) DEFAULT   
  CHARACTER SET utf8mb4 COLLATE `utf8mb4_unico  
  de_ci` ENGINE = InnoDB                        
                                                

In AbstractMySQLDriver.php line 93:
                                                
  An exception occurred in driver: SQLSTATE[HY  
  000] [2002] Connection refused                
                                                

In PDOConnection.php line 31:
                                             
  SQLSTATE[HY000] [2002] Connection refused  
                                             

In PDOConnection.php line 27:
                                             
  SQLSTATE[HY000] [2002] Connection refused  
                                             

doctrine:schema:create [--dump-sql] [--em [EM]] [-h|--help] [-q|--quiet] [-v|vv|vvv|--verbose] [-V|--version] [--ansi] [--no-ansi] [-n|--no-interaction] [-e|--env ENV] [--no-debug] [--] <command>

mi .env tiene esto

DATABASE_URL=mysql://homestead:[email protected]:3306/homestead?serverVersion=5.7

alguien sabe como hacer este paso en Linux?

Lo siento, pero llevo meses intentando hacer el curso y no funciona absolutamente nada a la primera, me las tengo que arreglar por fuera.

Lo abandono por que es totalmente desesperante

Es incre铆ble que gaste horas en esta sola clase, pero ya tengo las tablas listas en MySQL.
A esta clase le falta definir bien la estructura de las tablas, nombre y tipo de cada campo.
Voy a seguir con el curso, si todo funciona bien, regresar茅 a esta clase 6 y dejar茅 la informaci贸n para que futuros estudiantes no sufran tanto como lo he hecho yo.