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
我正在编写我的第一个 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