Doctrine es un mapeador de objetos mejor conocido como ORM por sus siglas para PHP que puede ser implementada en varios framework como CodeIgniter y Symfony; en donde mapeamos una clase con una tabla relacional en base de datos; por ejemplo, si tenemos una tabla llamada Persons:
$person = new Person();
$person>name = 'Juan';
$person>surname = 'Cruz';
Entonces en nuestra base de datos tenemos una tabla que contiene al menos dos campos concernientes el nombre y apellido de la persona; con las líneas de código anterior podemos crear un nuevo registro en base de datos sin realizar ningun insert ni nada por el estilo (aunque una vez creado el objeto y establecido sus valores es necesario hacer un 'persist' para realizar el guardado).
Doctrine ideal para base de datos complejas
Doctrine nos trae muchas ventajas sobre todo cuando trabajamos con sistemas medianamente grandes o sistemas grandes ya que no tenemos que emplear sentencias SQL para hacer todas nuestras relaciones, si no una variación del SQL llamado DQL (Doctrine Query Language) el cual nos trae un objeto con otros objetos anidados dependiendo de la relación de la misma (por ejemplo, si en la base de datos de la tabla Persons contiene una relación con la tabla Pets en donde una persona tiene una o más mascotas, entonces al realizar la solicitud de UN registro persona a través de Doctrine nos devolverá los objetos de la tabla Pets en conjunto con el objeto Persons).
Empezando con Doctrine y Symfony
Para poder trabajar con Doctrine primero tenemos que generar las entidades de Doctrine las cuales incluyen la definición de la tablas relacionales de nuestra base de datos configurada al momento de la creación del proyecto y también creado nuestro Bundle.
En la entidad de Doctrine encontraremos datos como las foreign keys, primary keys, tipos de datos, relaciones entre las tablas, etc; todo para que en Doctrine pueda vincular nuestras tablas en base de datos a las clases PHP con sus getters y setters que definiremos más adelante y a la cual podemos personalizar en mayor medida; para generar las entidades de Doctrine empleamos:
php bin/console doctrine:mapping:import BackendBundle yml
Cómo ves, debemos de crear las entidades dentro de un Bundle que creamos en una anterior entrada:
Los Bundle para modularizar nuestros proyectos en Symfony
Una vez realizado el paso anterior, se habrán generado tantos archivos como tablas en nuestra base de datos tengamos que cuentan con la siguiente estructura:
BackendBundle\Entity\Comments:
type: entity
table: comments
indexes:
fk_comment_video:
columns:
- video_id
fk_comment_user:
columns:
- user_id
id:
id:
type: integer
NULLable: false
options:
unsigned: false
id: true
generator:
strategy: IDENTITY
fields:
body:
type: text
NULLable: true
length: 65535
options:
fixed: false
createdAt:
type: datetime
NULLable: true
column: created_at
manyToOne:
user:
targetEntity: Users
cascade: { }
fetch: LAZY
mappedBy: NULL
inversedBy: NULL
joinColumns:
user_id:
referencedColumnName: id
orphanRemoval: false
video:
targetEntity: Videos
cascade: { }
fetch: LAZY
mappedBy: NULL
inversedBy: NULL
joinColumns:
video_id:
referencedColumnName: id
orphanRemoval: false
lifecycleCallbacks: { }
Dichos archivos estarán ubicados en src/BackendBundle/Entity
.
Si nosotros generamos tablas o relaciones o cambiamos simplemente la base de datos en el desarrollo, basta con ejecutar nuevamente el comando anterior.
Ahora generamos las entidades que en realidad son las que vamos a definir cada uno de los métodos y variables que están mapeadas con las columnas de las tablas que definan; las entidades en Symfony vienen siendo como los modelos en CodeIgniter; para generar las entidades empleamos el siguiente comando:
php bin/console doctrine:generate:entities BackendBundle
php app/console generate:doctrine:entity
Ya ha este punto estamos listos para empezar a trabajar de manera conjunta con los controladores, vistas y entidades en Symfony como veremos en posteriores entradas.
Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter