Проблема доктрины: Не удается получить объект геометрии из данных, которые вы отправляете в поле GEOMETRY - PullRequest
0 голосов
/ 22 мая 2019

Я следовал этому руководству , чтобы добавить point тип в Учение.

Вот как я определяю поле координат в сущности:

/**
 * @ORM\Column(type="point", nullable=true)
 */
private $coordinates;

И вот как я пытаюсь сохранить сущность:

$obj = new GeoPoint();
$obj->setAddress('Test');
$obj->setCoordinates(new Point(40.7603807, -73.9766831));
$manager->persist($obj);
$manager->flush();

Моя конфигурация:

doctrine:
    dbal:
        types:
            point: Viny\PointType
        driver: 'pdo_mysql'
        server_version: '5.7'
        charset: utf8mb4
        default_table_options:
            charset: utf8mb4
            collate: utf8mb4_unicode_ci
        url: '%env(resolve:DATABASE_URL)%'
        mapping_types:
            point: point
    orm:
        auto_generate_proxy_classes: '%kernel.debug%'
        naming_strategy: doctrine.orm.naming_strategy.underscore
        quote_strategy: backend_lib.orm.quote_strategy
        auto_mapping: true
        mappings:
            App:
                is_bundle: false
                type: annotation
                dir: '%kernel.project_dir%/src/Entity'
                prefix: 'App\Entity'
                alias: App

Определение столбца БД результата:

`coordinates` point DEFAULT NULL,

В результате я получаю:

Произошла исключительная ситуация при выполнении 'INSERT INTO geo_point (address, coordinates) VALUES (?,?)' С параметрами ["Test", "POINT (-73.976683 40.760381)"]:

SQLSTATE [22003]: числовое значение вне диапазона: 1416 Невозможно получить геометрию объект из данных, которые вы отправляете в поле ГЕОМЕТРИЯ

Окончательный запрос:

INSERT INTO geo_point (address, coordinates) VALUES ('Test', 'POINT (-73.976683 40.760381)');

1 Ответ

1 голос
/ 23 мая 2019

Ваша опубликованная конфигурация доктрины неверна.Это должно быть:

#doctrine.yaml
doctrine:
    dbal:
        types: ### Use types instead of mapping_types
            point: App\...\GeoPointType

Вы можете сказать, что сопоставление является проблемой, потому что ваш сгенерированный sql:

INSERT INTO geo_point (address, coordinates) VALUES ('Test', 'POINT(-73.976683 40.760381)');

MySQL не понимает POINT.Это должно быть обернуто в PointFromText.Это обертывание осуществляется через:

    // class GeoPointType
    public function convertToDatabaseValueSQL($sqlExpr, AbstractPlatform $platform)
    {
        return sprintf('PointFromText(%s)', $sqlExpr);
    }

И оно явно не вызывается.

Вот рабочий пример .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...