我正在编程我的第一个symfony项目,我遇到了一个问题: 我有一个实体我称之为“加载”,它指的是调用“事务”(x事务属于1个加载)的其他实体:
/**
* @ORM\OneToMany(targetEntity="Transaction", mappedBy="load")
*
*/
private $transactions;
可以将事务标记为已删除,但它们会一直存储在数据库中。 我创建了一个自定义存储库和一些方法,为我提供了未删除的事务。
但如果我想用所有交易来获取负载,我会调用
$load = $loadRepository->find($id);
它做了它应该做的事情。它从数据库中获取引用给定负载的所有事务。
但我不希望在我的结果中删除已删除的交易。我怎么能得到这个?我绝对没有办法。当然,我可以迭代事务并删除已删除的事务,但我认为有更好的解决方案。
我尝试为事务注册存储库(这可行)并覆盖find-method(这不起作用)。 是否有另一种内部调用的方法,我必须覆盖?
提前谢谢你!
答案 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”的所有实体。
无论如何,谢谢您的回答/评论