Symfony2:Sonata实体中的自定义标识符

时间:2015-01-26 21:34:23

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

我有一个在__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,所以我不能使用自动增量。

所以,问题是sonata不让我创建实体,因为它将create选项作为执行编辑,因为该实体已经有一个id,但此实体此时不存在,所以它失败了。 / p>

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

任何人都知道如何解决它?另一种解决问题的类似方法是什么?

1 个答案:

答案 0 :(得分:0)

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

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

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