Здравствуйте. Суть вопроса.
Есть два селекта, надо получить их расхождение.
Делаю так:
SELECT * FROM tbl1 EXCEPT SELECT * FROM tbl2
На чистом SQL все работает, все хорошо. А теперь то же самое на DQL.
А доктрина так не умеет. Вариант какой... делаем так:
$query1 = $this->em->createQueryBuilder()
->select('c')
->form(MyClass::class, 'c')
->getQuery()
->getDQL();
$query2 = this->em->createQueryBuilder()
->select('c')
->form(OtherMyClass::class, 'c')
->getQuery()
->getDQL();
$dql = $query1 . ' EXCEPT ' . $query2;
$this->em
->createQuery($dql)
->getResult();
Да не тут то было. Доктрина не знает слова EXCEPT. Но мы ж не пальцем деланные, есть возможность регистрировать пользовательские языковые конструкции, типа DATEDIFF и все такое.
Делаем класс ExceptFunction extends FunctionNode, прописываем его в дотриновском конфиге, если запросить $this->em->getConfiguration() то наш класс там видно, все хорошо. Но эта гадость все равно не разбирает запрос. Такое ощущение что мой класс ExceptFunction не вызывается вообще при разборе DQL внутренностями доктрины. Видимо я что то делаю не так. А что не так понять не могу. Подскажите люди добрые, кто пользовался этой штукой, в чем моя проблема?