5
我有一個多租戶應用程序,我使用Doctrine Filters來過濾客戶端的SQL。Doctrine在WHERE子句中過濾代替LEFT JOIN
所以,當我想我的客戶項目清單我只是需要做一個「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而不是左連接過濾器?
東西沒有加在這裏。您的第二個查詢不是有效的DQL。你爲什麼要做'SELECT * FROM projects p ... LEFT JOIN projects p'?你確定你已經建立了你的連接嗎?通常DQL格式是'SELECT * FROM projects p LEFT JOIN p.projectMembers pm ...'。這個DQL在哪裏以及如何構建?此查詢是否來自您的分析器? – sjagr
DQL是正確的,我發佈的SQL更容易理解。 – costa
你說得對,我只是編輯了LEFT JOIN – costa