WHERT子句中的Doctrine Filter而不是LEFT JOIN

时间:2015-01-09 17:00:51

标签: php sql symfony doctrine-orm

我有一个多租户应用程序,我使用Doctrine Filters来过滤客户端的SQL。

所以,当我想要一个我的客户 Projects 的列表时,我只需要做一个" 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?

2 个答案:

答案 0 :(得分:0)

您在 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);

答案 1 :(得分:-2)

试试这个:

SELECT * FROM table1, table2 WHERE table1.id = table2.id

这可能会解决您的问题。