Cómo resolver la excepción de Symfony 5: Unknown database type point requested, Doctrine\DBAL\Platforms\MySQL57Platform may not support it

Cómo resolver la excepción de Symfony 5: Unknown database type point requested, Doctrine\DBAL\Platforms\MySQL57Platform may not support it

Recientemente, en un nuevo proyecto en el que estoy trabajando actualmente, he estado trabajando con un nuevo tipo de datos que nunca usé en proyectos de producción, el tipo de datos puntuales (Point). En este caso, estoy usando MySQL como motor de base de datos, por lo que insertar y modificar registros que usan el tipo de datos mencionado es bastante simple:

INSERT INTO `tableName`
    (`id`, `name`, `coordinates`) 
        VALUES 
    (NULL, 'My First Record', ST_GeomFromText('POINT(40.71727401 -74.00898606)'));

Sin embargo, utilizo Doctrine ORM con Symfony 5, por lo que hay un par de cosas que deben modificarse antes de que funcione sin problemas. Uno de los posibles problemas que puede enfrentar en Symfony al trabajar con este tipo de datos, es que no puede ser mapeado automáticamente por el comando doctrine:mapping:import para hacer ingeniería inversa. Esto significa que si tienes una base de datos que ya existe e intentas generar las entidades automáticamente con el siguiente comando:

php bin/console doctrine:mapping:import "App\Entity" "annotation" --path=src/Entity

Aparecerá la excepción especificada (se solicita un tipo de base de datos desconocido). Afortunadamente, Doctrine lo admite, sin embargo, debes instalar la extensión Doctrine 2 Spatial para que funcione. En este breve tutorial, te explicaré cómo permitir fácilmente realizar ingeniería inversa en tu base de datos con tipos de datos espaciales.

1. Instala la extensión espacial de Doctrine 2

Para resolver este problema, debes instalar Doctrine 2 Spatial Extension. Esta biblioteca de Doctrine2 ofrece soporte multiplataforma para tipos y funciones espaciales. Actualmente, se admiten MySQL y PostgreSQL con PostGIS. Los siguientes tipos de SQL / OpenGIS se han implementado como objetos PHP y los tipos de Doctrine que los acompañan:

  • Geometría
  • Punto
  • LineString
  • Polígono
  • Multipunto
  • MultiLineString
  • MultiPolygon
  • Geografía

Similar a Geometry, pero siempre se usa el valor SRID (SRID solo es compatible con PostGIS) y solo acepta coordenadas "geográficas" válidas.

  • Punto
  • LineString
  • Polígono

Hay soporte para valores de retorno WKB / WKT y EWKB / EWKT. Actualmente, solo se utiliza WKT / EWKT en las declaraciones. Para instalar esta extensión, ejecute el siguiente comando en su proyecto Symfony:

composer require creof/doctrine2-spatial

Para obtener más información sobre este proyecto, visita el repositorio oficial en Github aquí.

2. Habilitar el tipo de punto

Después de instalar la biblioteca de extensiones, solo necesitas habilitar los tipos que necesita para agregar soporte para mapeo. En este caso, solo necesito el tipo de datos de punto, por lo que la siguiente configuración funcionará en el archivo doctrine.yaml de configuración:

# project/config/packages/doctrine.yaml
doctrine:
    dbal:
        url: '%env(resolve:DATABASE_URL)%'
        types:
            point: CrEOF\Spatial\DBAL\Types\Geometry\PointType

El mismo proceso funcionará para diferentes tipos como Geometry, MultiPoint, MultiPolygon, Polygon, LineString, MultineString. Asegúrate de borrar la caché de tu proyecto Symfony e intentar mapear nuevamente. Tus entidades generadas automáticamente ahora contendrán las columnas con el tipo de punto:

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * ExampleEntity
 *
 * @ORM\Table(name="example", indexes={@ORM\Index(name="coordinates", columns={"coordinates"})})
 * @ORM\Entity
 */
class Example
{
    /**
     * @var point
     *
     * @ORM\Column(name="coordinates", type="point", nullable=true)
     */
    private $coordinates;

    public function getCoordinates()
    {
        return $this->coordenadas;
    }

    public function setCoordinates($coordinates): self
    {
        $this->coordinates = $coordinates;

        return $this;
    }
}

Que te diviertas ❤️!

Esto podria interesarte

Conviertete en un programador más sociable