【问题标题】:Symfony get nested entities which are not flagged as deletedSymfony 获取未标记为已删除的嵌套实体
【发布时间】:2017-04-07 12:03:47
【问题描述】:

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

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

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

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

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

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

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

我尝试为交易注册一个存储库(这有效)并覆盖 find-method(这无效)。 是否有另一种内部调用的方法,我必须重写?

提前致谢!

【问题讨论】:

标签: php symfony doctrine entity


【解决方案1】:

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

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

【讨论】:

  • 谢谢,但我找到了不使用扩展的解决方案
【解决方案2】:

我找到了解决办法:

#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”的实体。

还是谢谢你的回答/cmets

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多