как в Doctrine 2 сделать self join без указания явных связей?
Есть абстрактная сущность. Например, новость. При каждом редактировании мы создаем в БД новую новость с неким номером, другим текстом и новой датой. Пускай для этого у нас есть три поля. (id,newsId,text,date).
без id нам никуда, но это не важно. Все это замечательно работает.
А теперь мне нужно сделать выборку такого плана: em->createQuery("select news1, news2 from
testBundle\Entity\news news1
left join
testBundle\Entity\news news2
on (news1.newsId=news2 .newsId)
where news1.date ='today' and news2.date ='1 day ago')
->setMaxResults(10)
->getResult();
Воооот… то есть с выдернуть две новости с одинаковыми ИД, но с последовательными датами. Естественно, поскольку связь между новостями не описана в модели ORM, Конструктор запросов ругается.
"Identification Variable testBundle\Entity\news used in join path expression but was not defined before."(с)
Курю пока что Versionable, но переделывать то, что уже есть не хочется. SQL-запрос составлен, но как его «затискать» в ORM, не могу придумать.
Буквально сегодня занимался примерно тем же. Это возможно. Решений проблемы несколько. Можно пострадать с DQL а можно написать через Native SQL. Второй вариант работает всегда, но вам придется описать и мэппинг результатов (дело не хитрое, но утомляет).
Хотя в вашем случае было бы логичнее использовать какое-либо расширение для версионизации сущьностей.
Да уж, ResultSetMapping выглядит пугающе =) Хорошо, что мне надо только три поля. Попробую пока так. Версионность не очень хороша, так как мне необходимо делать «слепки» по условиям. Скажем, каждое утро. Чтобы оценить как продвигалась работа за день.
Это же абстрактный пример. Замените новость рассказами или романами, за работой над которыми необходимо следить. Впаивать в табличку еще один столбец только ради одного отчета… не. Посмотрю как в доктрине выцепить имя таблички по классу, и сделаю обычный запрос. Ему, заодно, и индексы можно прописать какие надо. А то сама доктрина порой что-то аццкое лепит.