Symfony 获取未标记为已删除的嵌套实体

Symfony get nested entities which are not flagged as deleted

我正在编写我的第一个 symfony 项目,但遇到了一个问题: 我有一个实体,我称之为 "load",它指的是调用 "transaction" 的其他实体(x 事务属于 1 个负载):

 /**
 * @ORM\OneToMany(targetEntity="Transaction", mappedBy="load")     
 * 
 */
  private $transactions;

可以将交易标记为已删除,但它们会继续存储在数据库中。 我创建了一个自定义存储库和一些方法来为我提供未删除的事务。

但是如果我想获取包含所有事务的负载,我调用

 $load = $loadRepository->find($id);

它做了它应该做的。它从数据库中获取引用给定负载的所有事务。

但我不想在结果中包含已删除的交易。我怎样才能做到这一点?我完全没有办法。当然,我可以遍历事务并删除已删除的事务,但我认为有更好的解决方案。

我试图为交易注册一个存储库(这有效)并覆盖查找方法(这不起作用)。 是否有另一种内部调用的方法,我必须覆盖?

提前致谢!

如果我正确理解了你的问题,这个行为已经存在于扩展 SoftDeletable 中,你可以找到文档 here

您只需在 Transaction 实体上添加 deleteAt 属性 之类的内容,然后所有在该字段中包含数据的实体都将被自动过滤,就像它们真的被删除一样。如果您想查找所有交易实体,您可以随时禁用查询过滤器。

我找到了解决方案:

#config.yml:

doctrine:
    orm:
         filters:
            deletedFilter:
                class: AppBundle\Filter\SoftDeletedFilter
                enabled: true

_

namespace AppBundle\Filter;
use Doctrine\ORM\Mapping\ClassMetaData,
Doctrine\ORM\Query\Filter\SQLFilter;

class SoftDeletedFilter extends SQLFilter
{
    public function addFilterConstraint(ClassMetadata $targetEntity, $targetTableAlias)
    {

        if(!is_subclass_of($targetEntity->rootEntityName, "AppBundle\Entity\SoftDeleteableInterface")){
            return "";
        }
        return $targetTableAlias.'.deleted = 0'; 
    }
}

现在,如果删除值不为 0,将不包括所有实现(空)接口 "SoftDeleteableInterface" 的实体。

无论如何谢谢你answers/comments