Задать вопрос
@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 внутренностями доктрины. Видимо я что то делаю не так. А что не так понять не могу. Подскажите люди добрые, кто пользовался этой штукой, в чем моя проблема?
  • Вопрос задан
  • 155 просмотров
Подписаться 2 Средний Комментировать
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 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

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

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

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽