Php 第二条原则:后置调用不起作用
我需要实体的ID,我正在进行PostPersist调用。以下几点应该行得通。我var_dump,我确实得到了ID,实际上$this->path在调试时是正确的。但是,数据库中的结果为空。就好像后置派从未发生过一样。这有什么问题?另外,@HasLifecycleCallbacks在我的实体类的顶部被注释Php 第二条原则:后置调用不起作用,php,symfony,doctrine-orm,doctrine,Php,Symfony,Doctrine Orm,Doctrine,我需要实体的ID,我正在进行PostPersist调用。以下几点应该行得通。我var_dump,我确实得到了ID,实际上$this->path在调试时是正确的。但是,数据库中的结果为空。就好像后置派从未发生过一样。这有什么问题?另外,@HasLifecycleCallbacks在我的实体类的顶部被注释 /** * @ORM\PostPersist * @ORM\PreUpdate */ public function setPathFromParent(\Doctrine\ORM\Event
/**
* @ORM\PostPersist
* @ORM\PreUpdate
*/
public function setPathFromParent(\Doctrine\ORM\Event\LifecycleEventArgs $e)
{
$newTermData = $e->getEntity();
$id = $newTermData->getId();
if($this->getParentTermData() != '')
$this->path = $this->getParentTermData()->getPath() . '.' . $this->getId();
else
$this->path = $id;
}
这是因为在PostPersist中,EntityManager不会刷新对实体所做的任何更改 如果要避免对实体执行后续更新,请执行以下操作:
//Controller or other place to get
$newTermData = //create it some how
$em->persist($newTermData);
$em->flush();
$id = $newTermData->getId();
if($newTermData->getParentTermData() != '')
$newTermData->path = $newTermData->getParentTermData()->getPath() . '.' . $newTermData->getId();
else
$newTermData->path = $id;
$em->flush($newTermData);
然后,您可以改变使用自动递增的ID列,然后让条令处理,以便可以预测下一个ID是什么,然后使用
prePersist
执行所需操作。这是因为在postersist中,EntityManager不会刷新对实体所做的任何更改
如果要避免对实体执行后续更新,请执行以下操作:
//Controller or other place to get
$newTermData = //create it some how
$em->persist($newTermData);
$em->flush();
$id = $newTermData->getId();
if($newTermData->getParentTermData() != '')
$newTermData->path = $newTermData->getParentTermData()->getPath() . '.' . $newTermData->getId();
else
$newTermData->path = $id;
$em->flush($newTermData);
然后,您可以改变使用自动递增的ID列,然后让条令处理该列,以便可以预测下一个ID是什么,然后使用
prePersist
执行您想要执行的操作。您试图对该ID执行什么操作?postPersist仅在数据库调用完成后发生。我不相信它会再做一次有意义的更新。那么,哪个生命周期回调允许我进行这种更改呢?老实说,我不会这样做,只是将该功能添加到getPath()调用中。所以php在被调用时会构建路径。你想用这个ID做什么?postPersist仅在数据库调用完成后发生。我不相信它会再做一次有意义的更新。那么,哪个生命周期回调允许我进行这种更改呢?老实说,我不会这样做,只是将该功能添加到getPath()调用中。所以php在被调用时会构建路径,这不是我想要的。我希望能够在创建记录时存储路径字段。在创建记录之前,您无法访问ID,因此如果您不想生成路径,则必须在控制器中进行额外调用。@karmacode我意识到这是超晚更新,但在获得对原始答案的否决票后,我想我会更新答案,以找到更好的解决方案。这不是我想要的。我希望能够在创建记录时存储路径字段。在创建记录之前,您无法访问ID,因此如果您不想生成路径,则必须在控制器中进行额外调用。@karmacode我意识到这是超晚更新,但在获得对原始答案的否决票后,我想我会将答案更新为更好的解决方案。