在坚持和冲洗它之前,有没有办法获得该学说将给予实体的ID?
答案 0 :(得分:7)
避免使用自动生成的标识符
- 您的数据库操作将相互阻止
- 您拒绝批量插入
- 您无法进行多请求交易
- 您的对象在保存之前无效
- 没有数据库
,您的对象无效改为使用UUID
public function __construct() { $this->id = Uuid::uuid4(); }
*自版本2.3起,Doctrine也支持UUID
生成策略。
答案 1 :(得分:1)
当您的实体配置为使用AUTO
策略(doc)生成ID时,无法进行此操作。在该策略中,id由数据库使用serial,auto_increment或类似函数生成,具体取决于您使用的数据库。基本上数据库在执行INSERT时分配id。
然而,您可以使用other strategy而不是AUTO
,例如sequence generator。在这种情况下,您可以在刷新之前知道id,但是您需要自己更新具有此值的实体(Doctrine
这里不会有任何魔法)
答案 2 :(得分:1)
在刷新之前,甚至没有分配ID。在刷新时,将根据您的ID逻辑设置ID。如果它是增量的,那么您可以读取特定表的最后一行ID,然后在其中添加+1,但无论如何这都不是一个好的解决方法。
但是,(尽管您的问题不是关于此的)如果您需要使用实体的ID,并且由于某些奇怪的原因而无法遵循上述建议,则可以进行两次刷新(这也不是无论如何都是很好的做法,但这只是一种解决方法。
我的意思是,先冲洗,然后setProperty(with getID)并再次冲洗。例如,您有一个具有Title属性的Post实体。出于某些(我不知道为什么)的原因,您想要插入ID与用户指定的标题。因此,在这种情况下,您可以按照以下方式进行操作(再次,这不是一个好习惯,我希望有人在这里展示出更好的方式)
$entityManager->flush();
$yourEntity->setText($yourEntity->getTitle() . 'with ID: ' . $yourEntity->getId());
$entityManager->persist($yourEntity);
$entityManager->flush();
可能需要帮助。
答案 3 :(得分:0)
从我的观点来看,这是不可能的。你为什么需要那个? 您可以使用另一个名为 code 的id,将其生成为uniqid(),并且可以在持久化之前使用。
答案 4 :(得分:0)
正如Thomasz所提到的,使用AUTO策略无法在刷新之前获得ID。实际上,使用自动策略不是Doctrine为您的实体提供id,而是自动生成id的DBMS。要在刷新之前访问id,您可以自己生成id。实际上建议这样做,请参阅此视频,了解最佳做法:https://www.youtube.com/watch?v=rzGeNYC3oz0