[英]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.