Как я могу использовать Symfony с SELECT внутри предложения WHERE?Я получил ошибку - PullRequest
0 голосов
/ 12 февраля 2019

Я переношу Mysql SQL в проект Symfony и получаю сообщение об ошибке от TLP при выполнении SQL.Я предполагаю, что проблема во втором SELECT внутри предложения WHERE.

Если я использую оригинальный SQL и использую без фреймворка Symfony, у меня нет проблем.Кроме того, если я использую предложение WHERE с "(vars.ns IN (SELECT ...))", я не получаю ошибок, но SQL не должен быть таким.

date_default_timezone_set('UTC');
    $em = $this->getContainer()->get('doctrine')->getManager();
    $query = $em->createQuery("SELECT vars.dm, vars.ns, vars.mc, vars.ac, vars.sf, vars.cn, vars.mp, vars.ta, vars.mo, vars.mh, vars.pa, vars.sp, vars.so, vars.sh, vars.sn, vars.mm, vars.ms, vars.gs, vars.a1, vars.a2, vars.updated FROM BaseBundle:Vars vars WHERE (SELECT device.id FROM BaseBundle:Device device WHERE device.ns = vars.ns AND device.idUser IS NOT NULL AND device.idUser != '422' AND device.idUser != '819') AND vars.idDevice IS NOT NULL AND vars.updated > :time")->setParameter('time', date('Y-m-d H:i:s', strtotime('-31 days')));
    $historics = $query->getResult(); 

И я получаю эту ошибку:

  [Doctrine\ORM\Query\QueryException]
  [Syntax Error] line 0, col 233: Error: Expected Literal, got 'SELECT'

Этот SQL должен возвращать 276 строк, и это происходит, но не в Symfony.Есть идеи по этому поводу?Большое спасибо,

ОБНОВЛЕНИЕ: MYSQL ОРИГИНАЛЬНЫЙ ЗАПРОС

SELECT 
vars.dm,
vars.ns,
vars.mc,
vars.ac,
vars.sf,
vars.cn,
vars.mp,
vars.ta,
vars.mo,
vars.mh,
vars.pa,
vars.sp,
vars.so,
vars.sh,
vars.sn,
vars.mm,
vars.ms,
vars.gs,
vars.a1,
vars.a2,
vars.updated
FROM
table_3.vars
WHERE
   (SELECT 
        device.id_user
    FROM
        table_3.device
    WHERE
        device.ns = vars.ns
            AND device.id_user IS NOT NULL
            AND device.id_user != '422'
            AND device.id_user != '819')
    AND vars.id_device IS NOT NULL
    AND vars.updated > NOW() - INTERVAL 30 DAY

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Вы получаете эту ошибку

Ожидаемый литерал, получен 'SELECT'

, поскольку доктрина пытается проанализировать условие подзапроса:

(SELECT device.id FROM BaseBundle:Device device WHERE device.ns = vars.ns AND device.idUser IS NOT NULL AND device.idUser != '422' AND device.idUser != '819')

и ожидает, что это будет литерал

Это происходит потому, что не было определено сравнение для вышеупомянутого условия, и доктрина предполагает, что это должно быть литералом, и когда "видит", который начинается с" SELECT ", он выдает ошибку.

Чтобы преодолеть это, добавьте сравнение (например, > 0 ) к условию:

(SELECT device.id FROM BaseBundle:Device device WHERE device.ns = vars.ns AND device.idUser IS NOT NULL AND device.idUser != '422' AND device.idUser != '819') > 0
0 голосов
/ 12 февраля 2019

Прежде всего Doctrine не использует SQL, а использует DQL.DQL выглядит аналогично, но работает немного иначе, когда вы говорите о свойствах и полях.При создании Doctrine Query вы должны использовать имена свойств, а не имена полей, и сущность, на которую вы ссылаетесь, должна существовать с такими свойствами.Присутствует ли ваша сущность BaseBundle: Vars?и есть ли у него свойства, упомянутые в строке запроса?А как насчет устройства устройства?

...