Я не могу заставить работать аннотации 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 перед вставкой нового объекта в базу данных.
Конечно, вы делаете. База данных mysql не сделает этого за вас. Это не похоже на автоматическое увеличение. Если только вы не хотите возиться с триггерами и тому подобным.
Cerad, правильно, это не MySql генерирует UUID, а Doctrine делает это за кулисами на основе аннотаций. Я исправил проблему, это была проблема размещения имен и использования подпапок в моей структуре каталогов.






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