【问题标题】:How can I use Symfony with a SELECT inside a WHERE clause? I got error如何在 WHERE 子句中使用带有 SELECT 的 Symfony?我有错误
【发布时间】:2019-02-12 09:23:14
【问题描述】:

我正在将 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 原始查询

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

【问题讨论】:

  • 你可能会错过像WHERE vars.device_id IN (SELECT ...)这样的东西
  • 我在您的查询中没有看到IN 语句,现在您的查询确实不正确
  • 重点是我在 vars 表(vars.id)和设备表之间没有任何关系。所以,如果我使用 vars.id 结果是错误的。在 MYSQL 中没有它可以正常工作。我用 Mysql 查询更新

标签: mysql symfony doctrine where


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    你得到这个错误

    预期的文字,得到'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')
    

    并希望它是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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-14
      • 1970-01-01
      • 2021-03-14
      • 2020-01-14
      • 1970-01-01
      • 2019-07-15
      • 1970-01-01
      • 2013-07-07
      相关资源
      最近更新 更多