【问题标题】:Symfony2: Custom identifier in Sonata entitiesSymfony2:奏鸣曲实体中的自定义标识符
【发布时间】:2015-03-25 09:35:14
【问题描述】:

我有一个在 __construct 函数上生成的具有自定义 ID(即 UUID)的实体。

namespace AppBundle\Entity;
use Rhumsaa\Uuid\Uuid;
use Doctrine\ORM\Mapping as ORM;

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

    /**
    * @ORM\Column(type="string")
    */
    private $name;

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

此实体用于奏鸣曲以及项目的其他部分。在持久化和刷新它之前,我需要这个实体有 id,所以我不能使用自动增量。

所以,问题是奏鸣曲不允许我创建实体,因为它采用创建选项作为并在执行时进行编辑,因为该实体已经有一个 id,但该实体此时不存在,所以它失败了。

问题不在于生成 UUID 的库,'id' 的任何值都失败。

有人知道怎么解决吗?解决问题的另一种类似方法?

【问题讨论】:

  • 你能显示一些代码来澄清你的意思吗?
  • 我已经编辑了问题。

标签: php doctrine-orm uuid symfony-sonata sonata


【解决方案1】:

你不应该在构造函数中设置你的 id,而应该在第一次持久化之前使用prePersist Doctrine 事件来改变你的实体。

您可以使用注释来执行此操作,请参阅the Doctrine Documentation on prePersist

在构造函数中设置 id 的问题是当你从数据库中检索它时可能会覆盖它,在这种情况下它会不正确。

【讨论】:

  • 该实体也用于非奏鸣曲代码中,我需要在将其持久化到数据库之前拥有一个 ID。如何解决?
  • 为什么在持久化之前需要ID?只能坚持吗?在这种情况下,prePersist 将预先填充它。否则,如果是管理关系,我建议您仅在实体持久化后检索 ID。
  • 用于测试目的。例如,我有一个记录 de id 的服务: $this->logger->info("Person: ".$person->getId());而且我不想坚持和刷新该实体,因为它花费了大量时间,而且我不想在该测试中注入真正的实体管理器,只是一个模拟。
  • 你的意思是你想在持久化之前记录id?那你为什么不记录有关该实体的其他信息呢? ID 应尽可能由 DBMS 管理。
  • 这不是真的。在教义中,构造函数仅在第一个实体创建期间被调用一次。然后通过代理类初始化所有对象。
猜你喜欢
  • 2019-07-04
  • 2016-04-17
  • 2012-07-03
  • 1970-01-01
  • 2017-06-03
  • 1970-01-01
  • 2020-10-20
  • 2015-11-09
  • 2016-03-13
相关资源
最近更新 更多