5
私はマルチテナントアプリケーションを持っていますが、私はDoctrine Filtersを使ってSQLをクライアントでフィルタリングしています。だから、DoctrineフィルタでWHERE句を代わりにLEFT JOIN
、私は私のクライアントのリストをしたいプロジェクト私はちょうど「のgetAll」を行う必要があるとフィルタは、自動的にこのようなWHERE句、上のSQLを追加します:
SELECT *
FROM projects p
WHERE p.client_id = 1 #(appended by the filter)
マイ問題は私が例えば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)
ではありません、ないWHERE句、すべてProjectMembersを返しますので、無用のフィルタを作成するには、左にSQLのJOIN追加されます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
}
任意のアイデアどのように私はこの問題を解決することができ、LEFT JOINはWHEREの代わりにフィルタを追加しますか?
ここには何も追加されていません。 2番目のクエリは有効な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