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ć
相关产品推荐
相关产品推荐

