【问题标题】:Doctrine Filter in WHERE clause instead LEFT JOINWHERE 子句中的 Doctrine 过滤器而不是 LEFT JOIN
【发布时间】: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


【解决方案1】:

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

https://symfony.com/doc/3.3/doctrine/repository.html

然后就可以引用函数了。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 2021-02-15
    • 2017-07-31
    • 1970-01-01
    相关资源
    最近更新 更多