2010-09-11 2 views
2

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

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

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

Теперь я хочу, чтобы мой метод в классе MyUser, чтобы добавить некоторые присоединяется к столу с псевдонимом «КФ», но варьируя в зависимости от таблицы, которая «» CF алиасы. Я хочу называть это следующим образом:

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

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

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

ответ

2

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

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

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

Смежные вопросы