我有一个 Doctrine2 侦听器和过滤器,作为过滤掉任何未批准/草稿实体的一种手段,它在它所应用的实体上运行良好,但是,我不知道如何让它适用于它的关系。
假设该实体称为类别,然后我有与该类别相关的产品,当我findBy()
为产品执行时,我需要查询以检查它们相关的类别是否已获得批准。
select * from products p
left join category c on p.category_id = c.id
where p.id = 5
and c.approved = true
粗体字是我的过滤器或等效物需要注入的。
我该如何实施呢?
到目前为止,我在过滤器中注入了一个子查询作为 where 的一部分,但这看起来很糟糕,我认为必须有更好的方法:
class ApprovableFilter extends SQLFilter
{
protected $listener;
protected $entityManager;
public function addFilterConstraint(ClassMetadata $targetEntity, $targetTableAlias)
{
$config = $this->getListener()->getConfiguration($this->getEntityManager(), $targetEntity->name);
/* this bit works fine for the category */
if (isset($config['approvable']) && $config['approvable']) {
$column = $targetEntity->columnNames[$config['fieldName']];
return $targetTableAlias.'.'.$column.' = true';
}
/* this bit works for products.. but seems like a pretty poor solution */
if (isset($targetEntity->associationMappings['category'])) {
$config = $this->getListener()->getConfiguration(
$this->getEntityManager(),
$targetEntity->associationMappings['category']['targetEntity']
);
return '(
select d.id from dealership d
where d.id = '.$targetTableAlias.'.dealership_id
and d.'.$config['fieldName'].' = true
) is not null';
}
}