在刷新Symfony之前获取id

时间:2017-01-25 10:15:58

标签: php symfony

在坚持和冲洗它之前,有没有办法获得该学说将给予实体的ID?

5 个答案:

答案 0 :(得分:7)

来自Doctrine Best Practices

  

避免使用自动生成的标识符

     
      
  • 您的数据库操作将相互阻止
  •   
  • 您拒绝批量插入
  •   
  • 您无法进行多请求交易
  •   
  • 您的对象在保存之前无效
  •   
  • 没有数据库
  • ,您的对象无效   
     

改为使用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