Доктрина Symfony ORM не генерирует MySQL UUID с PHP 7.2 - PullRequest
0 голосов
/ 30 октября 2018

Я не могу заставить работать аннотации 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 имеет значение null / blank

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

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

Что я делаю не так?

1 Ответ

0 голосов
/ 30 октября 2018

Я знаю, что это не отвечает на ваш вопрос, но я думаю, что это все еще может быть полезно. Одним из преимуществ 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")
...