2015-01-09 70 views
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而不是左連接過濾器?

+0

東西沒有加在這裏。您的第二個查詢不是有效的DQL。你爲什麼要做'SELECT * FROM projects p ... LEFT JOIN projects p'?你確定你已經建立了你的連接嗎?通常DQL格式是'SELECT * FROM projects p LEFT JOIN p.projectMembers pm ...'。這個DQL在哪裏以及如何構建?此查詢是否來自您的分析器? – sjagr

+0

DQL是正確的,我發佈的SQL更容易理解。 – costa

+0

你說得對,我只是編輯了LEFT JOIN – costa

回答

-2

試試這個:

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

這可能會解決您的問題。