信条symfony orm不使用php7.2生成mysql uuid

n8ghc7c1  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(291)

我无法让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;
        }
    }

将记录添加到表中时,id字段保留为null/空白。如果我在mysql上设置了strict\u trans\u tables模式,那么在尝试将记录添加到数据库时会出现错误:

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

如果没有该模式,则会添加记录,但uuid为null/空白
另外请注意,如果使用以下注解,则自动生成的id将正确创建并存储在表的id字段中

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

我做错什么了?

zlhcx6iw

zlhcx6iw1#

我知道这不能回答你的问题,但我认为这可能还是有帮助的。uuid的优点之一是,可以在插入实体之前生成它们。这意味着您在保存之前有一个标识符,您可以引用它。为了使其工作,您需要使用库来生成uuid,然后在构造函数中执行此操作。据我所知,最常见的是ramsey/uuid,在symfony和ramsey/uuid理论的背景下。有了这个,你的实体可能看起来像这样:

/**
 * @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")

相关问题