我有两个通过一对多关系链接在一起的实体,并且我在两个实体上都使用了软删除。因为我使用软删除,所以读取数据有点棘手,因为我需要在读取之前检查删除的标志是否设置为false。
实体的基本设置是:
class Division extends MasterData {
...
/**
* @var Asset
*
* @ORM\OneToMany(targetEntity="Asset", mappedBy="division")
*/
private $assets;
public function __construct() {
$this->assets = new ArrayCollection();
}
public function getAssets() {
return $this->assets;
}
public function addAssets(Asset $asset) {
$this->assets[] = $asset;
return $this;
}
...
}
class Asset extends MasterData {
...
/**
* @var Division
*
* @ORM\ManyToOne(targetEntity="Division", inversedBy="assets")
*/
private $division;
...
}
class MasterData {
/**
* @ORM\Column(name="deleted", type="boolean", options={"default":0})
*/
protected $deleted;
public function __construct() {
$this->deleted = 0;
}
...
}
这些只是实体的片段,而不是整个事件的片段。
当我在Division
的控制器中时,我想提取与该分部相关且未标记为已删除的所有Assets
的列表。我可以看到几种方法。
一个简单的解决方案是创建一个自定义存储库来处理数据提取。但是,当我想进一步过滤数据时(例如,使用findBy()
),这将提供限制。
第二种解决方案是将getAssets()
实体中的Division
函数更改为仅返回未删除的资产。然而,这意味着我从数据库中提取所有数据,然后将其过滤掉,效率非常低。
理想情况下,我正在寻找一种方法来改变实体本身的定义,为资产本身添加where子句,以便在实体中进行过滤,从而消除对自定义存储库的需求等等有效的选择。与我如何在注释中定义@ORM\OrderBy()
类似,是否有类似的方法可以让我在执行前过滤掉已删除的资产而无需自定义存储库?
提前致谢:)
答案 0 :(得分:3)
Doctrine不支持映射中的条件关联。要实现此行为,您可以使用Criteria API in the entity methods。是的,在这种情况下,所有数据都将在应用条件之前从DB中获取。
但是Doctrine(> = 2.2)支持Filters。此功能允许将一些SQL添加到所有查询的条件子句中。可以通过此功能实现软删除。
DoctrineExtensions库已具备此功能(SoftDeletable,基于过滤器API)。