我想系统地过滤学说查询,因此无论何时使用存储库,我都不必指定一些数据。
例如,我有一个单独的数据库,其中实体绑定到客户端。我希望能够检索我的实体,无论我是这个还是那个客户端透明地喜欢:
$entities = $em->getRepository('ns:Entity')->findAll();
所以我使用了一个过滤器,我希望得到类似的东西:
public function addFilterConstraint(ClassMetadata $targetEntity, $targetTableAlias)
{
$id = $this->get('session')->get('current_client_id');
return sprintf("$targetTableAlias.client_id=%d", $id);
}
问题是,过滤器在sql级别运行,因此它不能识别容器,因此我无法访问会话或服务(这可能是错误的)。
知道如何处理动态过滤吗?
我尝试使用自定义存储库,但同样的问题发生了,而且我必须为每个实体复制函数。
[编辑]
您可以解决此问题,将参数传递给过滤器:
$filter = $this->doctrine->getManager()->getFilters()->enable('my_filter');
$filter->setParameter('current_fair_id', $currentFair->getId());
然后剩下要做的就是在QueryFilter继承类的addFilterConstraint方法中获取参数:
$value = $this->getParameter('current_fair_id');
答案 0 :(得分:0)
我无法向您展示 symfony2 的实际示例,但在 zf2 中: Setup Doctrine 2 filters in Zend Framework 2
无论如何,通过在代码中找到启用过滤器的位置,这应该可以移植到 symfony2 。您可以在此处设置/添加 session_id :
等参数$id = $this->get('session')->get('current_client_id');
$filter = $entityManager->getFilters()->enable('your_filter_class_name');
$filter->setParameter('current_client_id', $id);
Please see Doctrine docs here:
应该通过SQLFilter #setParameter()在过滤器对象上设置查询的参数。只有通过此功能设置的参数才能用于过滤器。 SQLFilter#getParameter()函数负责正确引用参数。