在教义产生的两个值(Two Generated Values in Doctrine)

2019-07-05 14:07发布

我想在我的学说,实体,实现人类可读的ID。 我想保持DB-ID为工作,并添加类似“PRE12-00005”(与前缀和新年,并在每个新的一年里从0开始)。 我尝试添加自定义-ID发电机,但似乎主义不能在一个实体有两个产生价值的工作。

/**
 * @var integer
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="IDENTITY")
 */
protected $id;

/**
 * @var string
 * @ORM\Column(name="name", type="string", length=25, unique=true)
 * @ORM\GeneratedValue(strategy="CUSTOM")
 * @ORM\CustomIdGenerator(class="NameGenerator")
 */
protected $name;

学说总是试图从我的发电机的返回值保存到“ID” - 场和空成“名”。 有没有实现它的另一种方式?

Answer 1:

从我所知道的GeneratedValue策略是保留主键,这意味着你只能在每个实体使用一次。

根据您的需求,你有几个选择,但:

  • 你总是可以有一个prePersist生命周期事件 ,设置你坚持它的第一次之前你喜欢的名字的任何值。

  • 如果你依赖于ID来生成它的另一个唯一的ID,你可以实现一个postPersist事件,设定你的名字出现,并确保您冲洗两次(第一次生成主键,第二次保存名称)。

  • 如果它的确定你的名字是在数据库一段时间空的,它可能是确定实施负荷后的事件,其中填充的名称,如果它是空的。 这样,你的应用程序总是能看到名字(因为它是从数据库加载或由餐后事件填充),当您添加或编辑的信息在第一时间之后的初始保存,你的名字也将被保存

  • 这可能是确定不保存名称,并经一定的cronjob /守护进程/队列产生使你的应用程序不必处理。 你需要做的唯一的事情就是确保缺少的名称不搞砸了的东西。

  • 也许这可能是好的,以产生不依赖于主键,因此可以通过生成一个密钥全局事件处理程序 。 当然,你有这样的一个事件处理程序,因为他是全球性的,被调用的每个对象你坚持下去,不管它是正确的实体的缺点。

  • 最后,但并非最不重要的,它可能是好的退却到存储过程/触发器,让数据库处理这个问题。 这样,您就不必乱用这个应用程序中。 但要注意,有可能是在路上的陷阱(如开发者忘记了这一点,因为它不是在代码中,但在数据库中!)。

可能有其他的方式。 我想说的是:不要使用generatedValue非主键的属性!



文章来源: Two Generated Values in Doctrine