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

时间:2017-04-07 12:03:48

标签: php symfony doctrine entity

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

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

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

但如果我想用所有交易来获取负载,我会调用

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

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

但我不希望在我的结果中删除已删除的交易。我怎么能得到这个?我绝对没有办法。当然,我可以迭代事务并删除已删除的事务,但我认为有更好的解决方案。

我尝试为事务注册存储库(这可行)并覆盖find-method(这不起作用)。 是否有另一种内部调用的方法,我必须覆盖?

提前谢谢你!

2 个答案:

答案 0 :(得分:1)

如果我已正确理解您的问题,此行为已存在于教条扩展SoftDeletable中,您可以找到文档here

您只需在deleteAt实体上添加类似Transaction属性的内容,然后所有包含此字段内数据的实体都会自动过滤,就像它们确实被删除一样。如果要查找所有事务实体,可以始终在查询中禁用过滤器。

答案 1 :(得分:0)

我找到了解决方案:

#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'; 
    }
}

现在,如果deleted-value不为0,则不会包含实现(空)接口“SoftDeleteableInterface”的所有实体。

无论如何,谢谢您的回答/评论