【发布时间】:2015-03-08 01:35:09
【问题描述】:
我有一个多租户应用程序,我正在使用 Doctrine Filters 按客户端过滤我的 SQL。
所以,当我想要一份我的客户项目的列表时,我只需要执行“getAll”,过滤器就会自动在 WHERE 子句上附加 SQL,如下所示:
SELECT *
FROM projects p
WHERE p.client_id = 1 #(appended by the filter)
我的问题是当我想要 ProjectMembers 时。过滤器会将 SQL 添加到 LEFT JOIN,而不是 WHERE 子句,使过滤器无用,因为将返回所有 ProjectMembers,即使它们不是来自客户端 1。
SELECT *
FROM projects p
LEFT JOIN project_members pm ON pm.project_id = p.id
AND p.client_id = 1 #(appended by the filter)
这是我的 addFilterConstrait
public function addFilterConstraint(ClassMetaData $targetEntity, $targetTableAlias)
{
$class = $targetEntity->getName();
if (array_key_exists($class, $this->disabled) && $this->disabled[$class] === true) {
return '';
} elseif (array_key_exists($targetEntity->rootEntityName, $this->disabled) && $this->disabled[$targetEntity->rootEntityName] === true) {
return '';
}
$config = $this->getFilterConfig($targetEntity->getReflectionClass());
if (!isset($config['clientFilter']) || !$config['clientFilter']) {
return '';
}
return $targetTableAlias. '.' . $config['columnName'] . ' = ' . $this->getParameter('client'); // getParameter applies quoting automatically
}
有什么想法可以解决这个问题,将过滤器添加到 WHERE 而不是 LEFT JOIN?
【问题讨论】:
-
这里没有加起来。您的第二个查询不是有效的 DQL。你为什么要
SELECT * FROM projects p ... LEFT JOIN projects p?你确定你已经正确地建立了你的加入吗?通常 DQL 格式为SELECT * FROM projects p LEFT JOIN p.projectMembers pm ...。这个 DQL 在哪里以及如何构建的?此查询是否来自您的分析器? -
DQL是正确的,我贴SQL是为了更容易理解。
-
你是对的,我刚刚编辑了左连接
标签: php sql symfony doctrine-orm