如何在WHERE子句中使用带有SELECT的Symfony?我收到了错误

问题描述 投票:0回答:2

我正在将Mysql SQL迁移到Symfony项目,当我执行SQL时,我从TLP收到错误。我猜问题是在WHERE子句中的第二个SELECT中。

如果我使用原始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 ORIGINAL QUERY

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
mysql symfony doctrine where
2个回答
0
投票

首先,Doctrine不使用SQL它使用DQL。 DQL看起来很相似,但是当你谈论属性和字段时,它的工作方式会有所不同。在创建Doctrine Query时,您必须使用属性名称而不是字段名称,并且您引用的实体必须与此类属性一起存在。你的BaseBundle:Vars实体存在吗?它是否具有查询字符串中提到的属性?设备实体怎么样?


0
投票

你得到这个错误

预期文字,得到'SELECT'

因为doctrine试图解析子查询条件:

(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')

并期望它是一个Literal

之所以发生这种情况是因为没有为上述条件定义comparison,并且学说假设这应该是文字,当“看到”它以“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
© www.soinside.com 2019 - 2024. All rights reserved.