Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.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
Php 在WHERE子句中过滤,而不是左连接_Php_Sql_Symfony_Doctrine Orm - Fatal编程技术网

Php 在WHERE子句中过滤,而不是左连接

Php 在WHERE子句中过滤,而不是左连接,php,sql,symfony,doctrine-orm,Php,Sql,Symfony,Doctrine Orm,我有一个多租户应用程序,我正在使用按客户端筛选SQL 因此,当我想要一个客户机项目列表时,我只需要执行一个getAll,过滤器会自动将SQL附加到WHERE子句上,如下所示: 选择* 来自项目p 其中p.client_id=1由过滤器追加 我的问题是当我想要例如ProjectMembers时。过滤器将把SQL添加到左连接,而不是WHERE子句,这使得过滤器变得无用,因为它将返回所有项目成员,即使它们不是来自客户机1 选择* 来自项目p 左加入项目成员pm ON pm.project\u id=p

我有一个多租户应用程序,我正在使用按客户端筛选SQL

因此,当我想要一个客户机项目列表时,我只需要执行一个getAll,过滤器会自动将SQL附加到WHERE子句上,如下所示:

选择* 来自项目p 其中p.client_id=1由过滤器追加 我的问题是当我想要例如ProjectMembers时。过滤器将把SQL添加到左连接,而不是WHERE子句,这使得过滤器变得无用,因为它将返回所有项目成员,即使它们不是来自客户机1

选择* 来自项目p 左加入项目成员pm ON pm.project\u id=p.id p.client_id=1,由过滤器追加 这是我的addFilterConstrait

公共函数addFilterConstraintClassMetaData$targetEntity$targetTableAlias { $class=$targetEntity->getName; 如果数组键存在$class,$this->disabled&&$this->disabled[$class]==true{ 回来 }否则如果数组\u键\u存在$targetEntity->rootEntityName,$this->disabled&&$this->disabled[$targetEntity->rootEntityName]==true{ 回来 } $config=$this->getFilterConfig$targetEntity->getReflectionClass; 如果!isset$config['clientFilter']| |!$config['clientFilter']{ 回来 } 返回$targetTableAlias.'.$config['columnName'].='.$this->getParameter'client';//getParameter自动应用引用 }
有什么办法可以解决这个问题,将过滤器添加到WHERE而不是LEFT JOIN?

在Symfony中执行的SQL越多,您很快就会发现为您的实体创建一个存储库、为每个实体使用一个存储库或与多个实体共享一个公共存储库要容易得多。然后在存储库中编写DQL。注意:DQL与SQL非常相似,但有其局限性

然后您可以引用该函数

$em = $this->getDoctrine()->getManager();
$data = $em->getRepository(EntityClassName::class)->repositoryFunctionName($paramifyouhaveany);

这里有点不对劲。您的第二个查询不是有效的DQL。你为什么要从项目中选择*p。。。左键连接项目p?您确定已正确构建联接吗?通常DQL格式为SELECT*FROM projects p LEFT JOIN p.projectMembers pm。。。。这个DQL是在哪里构建的,是如何构建的?这个查询来自您的探查器吗?DQL是正确的,我发布SQL是为了更容易理解。您是正确的,我只是编辑了左连接