Php 第二条原则:后置调用不起作用

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

我需要实体的ID,我正在进行PostPersist调用。以下几点应该行得通。我var_dump,我确实得到了ID,实际上$this->path在调试时是正确的。但是,数据库中的结果为空。就好像后置派从未发生过一样。这有什么问题?另外,@HasLifecycleCallbacks在我的实体类的顶部被注释

/**
 * @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我意识到这是超晚更新,但在获得对原始答案的否决票后,我想我会将答案更新为更好的解决方案。