@Dark_Dante

Doctrine как получить расхождение двух запросов?

Здравствуйте. Суть вопроса.
Есть два селекта, надо получить их расхождение.
Делаю так:
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 внутренностями доктрины. Видимо я что то делаю не так. А что не так понять не могу. Подскажите люди добрые, кто пользовался этой штукой, в чем моя проблема?
  • Вопрос задан
  • 151 просмотр
Пригласить эксперта
Ответы на вопрос 1
@Akina
Сетевой и системный админ, SQL-программист.
Делаю так:
SELECT * FROM tbl1 EXCEPT SELECT * FROM tbl2

Структуры таблиц совпадают?

Тогда
SELECT t1.*
FROM tbl1
LEFT JOIN tbl2 ON tbl1.primary_key = tbl2.primary_key
WHERE t2.primary_key IS NULL

Это должно без проблем отображаться на синтаксис фреймворка.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы