Doctrine Symfony ORM не генерирует MySQL UUID с PHP 7.2

Я не могу заставить работать аннотации ORM, чтобы UUID автоматически генерировался в MySQL после того, как новый объект, добавленный в таблицу, был сброшен. Вот мой код:

Сущность:

    /**
     * @ORM\Column(type = "guid")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy = "UUID")
     */
    protected $id;

В моем контроллере:

    /**
     * @RestRoute\Post("")
     * @RestRoute\Post("/")
     */
    public function createAction($version, Request $request)
    {
        $res = $this->getManager()->createFromData(
            (array) $request->request->all()
        );

        if ($res) {
            return new JsonResponse($request->request->all());
        }
    }

И в моем сервисе / менеджере

    /**
     * Adds a new record to the entity table
     *
     * @param   CwPackageType   $data
     * @return  CwPackageType   the newly created entity
     * @throws  Exception       throws database/doctrine exception
     */
    public function createFromData($data)
    {
        $this->getEntityManager()->getConnection()->beginTransaction();

        try {
            $rec = (new CwPackageType())->createFromData($data);

            $this->getEntityManager()->persist($rec);
            $this->getEntityManager()->flush($rec);
            $this->getEntityManager()->getConnection()->commit($rec);

            return $rec;
        } catch (Exception $e) {
            $this->getEntityManager()->getConnection()->rollback();

            throw $e;
        }
    }

Когда запись добавляется в таблицу, поле идентификатора остается пустым. Если я установил режим STRICT_TRANS_TABLES в MySQL, я получаю сообщение об ошибке при попытке добавить запись в базу данных:

General error: 1364 Field 'id' doesn't have a default value

Без этого режима запись добавляется, но UUID является пустым или пустым.

Также обратите внимание, что если я использую следующую аннотацию, автоматически сгенерированный идентификатор будет правильно создан и сохранен в поле идентификатора в таблице.

    /**
     * @ORM\Id
     * @ORM\Column(name = "id", type = "integer")
     * @ORM\GeneratedValue(strategy = "AUTO")
     */

Что я делаю неправильно?

Я сам этого не делал, но уверен, что вам нужно установить генератор uuid и указать доктрине, что нужно его использовать. Взгляните на этот вопрос. Я уверен, что где-то в документации есть официальный пример.

Cerad 30.10.2018 19:03

К сожалению, это не помогает, так как мне не нужно генерировать UUID перед вставкой нового объекта в базу данных.

user10560159 30.10.2018 20:24

Конечно, вы делаете. База данных mysql не сделает этого за вас. Это не похоже на автоматическое увеличение. Если только вы не хотите возиться с триггерами и тому подобным.

Cerad 30.10.2018 23:00

Cerad, правильно, это не MySql генерирует UUID, а Doctrine делает это за кулисами на основе аннотаций. Я исправил проблему, это была проблема размещения имен и использования подпапок в моей структуре каталогов.

user10560159 04.11.2018 15:36
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
4
1 691
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я знаю, что это не ответ на ваш вопрос, но я думаю, что это может быть полезно. Одним из преимуществ UUID является то, что они могут быть сгенерированы перед вставкой объекта. Это означает, что у вас есть идентификатор до его сохранения, на который вы можете ссылаться. Чтобы это сработало, вы должны использовать библиотеку для создания UUID, а затем выполнить это в конструкторе. Насколько я могу судить, наиболее распространенным для этого является ramsey / uuid, а в контексте Symfony и Doctrine ramsey / uuid-doctrine. С этим ваша сущность, вероятно, будет выглядеть примерно так:

/**
 * @ORM\Entity()
 */
class Foo
{
    /**
     * @ORM\Id()
     * @ORM\Column(type = "uuid")
     */
    private $id;

    public function __construct()
    {
        $this->id = Uuid::uuid4();
    }

    public function getId(): string
    {
        return $this->id->toString();
    }

    //...
}

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

 * @ORM\GeneratedValue(strategy = "CUSTOM")
 * @ORM\CustomIdGenerator(class = "Ramsey\Uuid\Doctrine\UuidGenerator")

Другие вопросы по теме