如何在 postRemove 事件期间获取实体的对象 id?

问题描述 投票:0回答:3

我有这样的东西:

public function postRemove(LifecycleEventArgs $args)
{
    $entity = $args->getObject();
    $entity->getId();
}

$entity
具有所选表中除 id 之外的所有属性,id 始终为
null

我希望它具有我要删除的项目的 ID。

php symfony doctrine-orm doctrine
3个回答
12
投票

如果您已经删除了该对象,则它不再有 id。

您可能想在

preRemove
仍然可用的情况下使用
id

您甚至可以使用

preRemove
将 id 存储在对象的非映射属性中,然后从
postRemove
上的对象获取该 id。

function preRemove(LifecycleEventArgs $args) {
   $object = $args->getObject();
   $object->storeId($object->getId());
}
function postRemove(LifecycleEventArgs $args) {
   $object = $args->getObject();
   $id     = $object->getStoredId();
}

1
投票

Symfony 中的服务是单例的。您可以像代理一样使用它们。 在侦听器中创建属性

$objectId
。然后按照以下步骤操作:

function preRemove(LifecycleEventArgs $args) {
   $object = $args->getEntity();
   $this->objectId($object->getId());
}

然后在帖子中删除:

function postRemove(LifecycleEventArgs $args) {
   $id     = $this->objectId;
}

0
投票

使用动态属性将在 PHP 8.2 中被弃用,并会在 PHP 9.0 中引发错误。

参考:https://github.com/doctrine/orm/issues/2326#issuecomment-969057626

通过这种方式使用特征可以很方便。

trait StoreIdAfterDeletionEntity
{
    private ?int $storedId;

    public function getStoredId(): ?int
    {
        return $this->storedId;
    }

    #[ORM\PreRemove]
    public function setStoredId(): static
    {
        $this->storedId = $this->getId();

        return $this;
    }
}
#[ORM\Entity]
#[ORM\HasLifecycleCallbacks]
class MyEntity
{
    use StoreIdAfterDeletionEntity;
}
© www.soinside.com 2019 - 2024. All rights reserved.