Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在symfony2中使用动态变量系统地过滤条令查询_Sql_Symfony_Filter_Doctrine - Fatal编程技术网

Sql 如何在symfony2中使用动态变量系统地过滤条令查询

Sql 如何在symfony2中使用动态变量系统地过滤条令查询,sql,symfony,filter,doctrine,Sql,Symfony,Filter,Doctrine,我希望系统地过滤条令查询,以便在使用存储库时不必指定某些数据 例如,我有一个数据库,其中实体绑定到客户端。我希望能够透明地检索我的实体,无论我是该客户机还是该客户机,如下所示: $entities = $em->getRepository('ns:Entity')->findAll(); 因此,我使用了一个过滤器,我想这样做: public function addFilterConstraint(ClassMetadata $targetEntity, $targetTableA

我希望系统地过滤条令查询,以便在使用存储库时不必指定某些数据

例如,我有一个数据库,其中实体绑定到客户端。我希望能够透明地检索我的实体,无论我是该客户机还是该客户机,如下所示:

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

我无法向您展示symfony2的工作示例,但在zf2中:

无论如何,这应该可以移植到symfony2,方法是在代码中找到启用过滤器的位置。您也可以在此处设置/添加参数,如会话id:

:

查询的参数应通过SQLFilter#setParameter()在filter对象上设置。过滤器中只能使用通过此功能设置的参数。SQLFilter#getParameter()函数负责正确引用参数


您在哪里定义了
addFilterConstraint
函数,它在实体中吗?您是否通过controller调用它?@Javad它在config.yml文件中被定义为一个过滤器,例如:filters{query{class:Path\QueryFilter,enabled:true}不可能向这个过滤器注入依赖关系。选项确实列出了!非常感谢。设置参数,然后使用$filter->getParameter()获取参数,效果非常好!很高兴看到PHP世界中的框架和ORM终于开始使用通用语言(或者至少是可移植语言!)也许您可以为symfony用户发布一个简短的代码片段(编辑问题)。
$id = $this->get('session')->get('current_client_id');
$filter = $entityManager->getFilters()->enable('your_filter_class_name');
$filter->setParameter('current_client_id', $id);