Как найти таблицу, связанную с псевдонимом в запросе Doctrine ORM? - PullRequest
2 голосов
/ 11 сентября 2010

Я использую Doctrine ORM 1.2 и Symfony 1.4 и хочу создать метод в классе myUser, который будет расширять экземпляр Doctrine_Query, передаваемый в качестве аргумента, с некоторыми дополнительными левыми соединениями и условиями.Хитрость в том, что я не всегда хочу, чтобы эти левые объединения выполнялись с корневым компонентом запроса, и мне нужно знать, какой таблице (классу записей) соответствует псевдоним - в некоторых случаях я хотел бы передать псевдонимдругой компонент и ожидайте, что он будет дополнен некоторыми дополнительными левыми объединениями и условиями.

Мой вопрос: как я могу проверить, какой компонент (по существу таблица) представляет данный псевдоним?Предположим, я создаю экземпляр Doctrine_Query:

$query = Doctrine_Query::create();
$query->from('Folder f')->leftJoin('f.ChildFolders cf');

Теперь я хочу, чтобы мой метод в классе myUser добавил несколько соединений в таблицу с псевдонимом 'cf', но в зависимости от таблицы, которая имеет псевдонимы 'cf'.Я хочу назвать это так:

$this->getUser()->limitQueryResultsWithSomeCondition($query, 'cf');

Это должно вернуть запрос с дополнительными элементами.Как я могу узнать, какая таблица обозначена псевдонимом 'cf' и существует ли она вообще в данном запросе?

Довольно просто, когда это корневая таблица запроса, который необходимо расширить, но я не могу найти способ сделать это в других случаях.

1 Ответ

2 голосов
/ 12 сентября 2010

Полагаю, я нашел собственное решение проблемы. Чтобы узнать, какой таблице / записи соответствует данный псевдоним, нужно использовать метод getQueryComponent. Предположим, что запрос такой же, как в вопросе выше. Затем решение выглядит следующим образом:

$alias = 'cf';
$query->getSqlQuery();
$component = $query->getQueryComponent($alias);
$recordClass = get_class($component['table']->getRecordInstance());

Хитрость в том, что перед вызовом метода getSqlQuery (или какого-либо метода, вызываемого внутри этого метода) компонент не будет найден, и будет выдано исключение.

...