gpt4 book ai didi

php - WHERE 子句中的 Doctrine 过滤器而不是 LEFT JOIN

转载 作者:行者123 更新时间:2023-12-03 17:37:27 24 4
gpt4 key购买 nike

我有一个 Multi-Tenancy 应用程序,我正在使用 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?

最佳答案

您在 Symfony 中执行的 SQL 越多,您很快就会发现为您的实体创建一个存储库、为每个实体使用一个存储库或与多个实体共享一个公共(public)存储库会容易得多。然后在存储库中编写您的 DQL。注意:DQL 很像 SQL,但也有其局限性。
https://symfony.com/doc/3.3/doctrine/repository.html
然后就可以引用函数了。

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

关于php - WHERE 子句中的 Doctrine 过滤器而不是 LEFT JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27865510/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com