You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Symfony5.4中如何访问Gedmo软删除的User实体?

解决软删除关联实体无法访问的问题

针对你遇到的关联查询软删除User报错的问题,有几种可行的解决方案:

方案一:给关联字段添加注解,允许加载软删除实体

在Message类的$sentBy字段上添加@Gedmo\SoftDeleteable(withDeleted=true)注解,这样Doctrine在加载该关联时会自动包含被软删除的User实体:

/**
 * @ORM\ManyToOne(targetEntity="User")
 * @ORM\JoinColumn(name="locked_by", referencedColumnName="id")
 * @Gedmo\SoftDeleteable(withDeleted=true)
 */
private $sentBy;

这个方案一劳永逸,针对该关联字段的所有查询都会自动加载软删除的User,不需要修改查询逻辑。

方案二:在查询构建器中手动包含软删除实体

如果你只需要在特定查询中获取软删除的User,可以在自定义Repository的查询方法中,通过添加条件让查询包含已软删除的记录:

// MessageRepository.php
public function findMessageWithDeletedSender(int $messageId): ?Message
{
    return $this->createQueryBuilder('m')
        ->leftJoin('m.sentBy', 'u')
        ->addSelect('u')
        ->where('m.id = :messageId')
        ->setParameter('messageId', $messageId)
        // 允许查询已软删除的User
        ->andWhere('u.deletedAt IS NULL OR u.deletedAt IS NOT NULL')
        ->getQuery()
        ->getOneOrNullResult();
}

调用这个方法获取Message时,就能正常通过$message->getSentBy()拿到软删除的User了。

方案三:临时启用软删除过滤器的withDeleted参数

如果你需要在一段代码逻辑中临时允许查询软删除实体,可以通过Doctrine的过滤器来实现:

// 假设在控制器或服务中
$entityManager = $this->getDoctrine()->getManager();

// 启用软删除过滤器并设置withDeleted参数
$filter = $entityManager->getFilters()->enable('soft-deleteable');
$filter->setParameter('withDeleted', true);

// 执行查询
$message = $entityManager->getRepository(Message::class)->find($messageId);
$deletedUser = $message->getSentBy(); // 此时能正常获取

// 用完后可以禁用过滤器,避免影响后续查询
$entityManager->getFilters()->disable('soft-deleteable');

原理说明

Gedmo的SoftDeleteable行为默认会在所有针对User实体的查询中自动添加deletedAt IS NULL的过滤条件,包括关联查询。上述方案本质都是通过不同方式绕过这个默认过滤,让被软删除的实体能够被查询加载。

内容的提问来源于stack exchange,提问作者Ivan Vulović

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 08:00:23