如何使用symfony2中的动态变量系统地过滤学说查询

时间:2014-05-07 14:34:21

标签: sql symfony filter doctrine

我想系统地过滤学说查询,因此无论何时使用存储库,我都不必指定一些数据。

例如,我有一个单独的数据库,其中实体绑定到客户端。我希望能够检索我的实体,无论我是这个还是那个客户端透明地喜欢:

$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');

1 个答案:

答案 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()函数负责正确引用参数。