簡體   English   中英

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

[英]Doctrine Filter in WHERE clause instead LEFT JOIN

我有一個多租戶應用程序,我正在使用Doctrine 過濾器按客戶端過濾我的 SQL。

因此,當我想要我的客戶項目列表時,我只需要執行“getAll”,過濾器就會自動將 SQL 附加到 WHERE 子句上,如下所示:

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 越多,您很快就會發現為您的實體創建存儲庫、為每個實體使用一個或與多個實體共享一個公共存儲庫要容易得多。 然后在存儲庫中編寫您的 DQL。 注意:DQL 很像 SQL,但它有其局限性。

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

然后就可以引用函數了。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM