如何使用queryBuilder修复“错误:预期文字,得到'SELECT'”?

时间:2019-11-22 22:31:01

标签: sql symfony doctrine-orm doctrine query-builder

我在执行查询时遇到问题,当我尝试进行子查询时出现此错误消息

   map.get(key)

在我的EventRepositoty CLass中进行以下查询:

     if (map.get(key)==null){
        ....
            }
     else {
          }

我该如何解决?

我不知道您是否能理解我的要求,所以让我解释一下:当标签和摄像头与查询中发送的标签和摄像头相同时,我想更新一个字段“ moveAt”。所以我做了一个子查询,因为我想要和其他条件是谁(总是更新最后一个)。我做一个子查询,因为我不能在更新查询中添加选择。

编辑: @Preciel帮助中DQL转储的结果

  

“ SELECT MAX(e.arrivedAt)来自App \ Entity \ Event e WHERE e.label =:var2   AND e.camera =:var3 AND e.camera =:var3 AND(e.arrivedAt <= SELECT   从App \ Entity \ Event到MAX(e.arrivedAt),其中e.label =:var2 AND   e.camera =:var3 AND e.camera =:var3)“

新=

  

“ UPDATE App \ Entity \ Event e SET event.moveAt =:var1 WHERE   e.label =:var2 AND e.camera =:var3 AND e.arrivedAt <=选择   从App \ Entity \ Event ev到MAX(ev.arrivedAt),其中ev.camera =:var3“

子查询

  

“ SELECT MAX(ev.arrivedAt)来自App \ Entity \ Event ev WHERE   ev.camera =:var3“

1 个答案:

答案 0 :(得分:1)

我会尝试做这样的事情:

public function updateMoveAtField($eventLabel, $cameraId) {
    $qb=$this->createQueryBuilder("event");
    $sqb=$this->createQueryBuilder("eventBis");

    $qb->update()
       ->set("event.moveAt", ":var1")
       ->andWhere("event.lavel=:var2")
       ->andWhere("event.camera=:var3")
       ->andWhere(
           $qb->expr()->lte("event.arrivedAt",
               "(".$sqb->select($qb->expr()->max("eventBis.arrivedAt"))  //Your sub query start here
                   ->andWhere("eventBis.camera=:var3")->getDQL().")")) //and end here
       ->setParameters(array(
           'var1'=>new \DateTime(),
           'var2'=>$eventLabel,
           'var3'=>$cameraId,
       ));

    // dump($qb->getDQL());
    // dump($qb->getQuery()->getSQL());
    // exit();

    return $qb->getQuery()->execute();
}

我添加了2行转储。如果它不起作用,请先转储DQL,然后转储SQL(SQL可能会失败),然后在注释中添加它们。

在第一次使用expr()时,我使用了lte()(小于或等于)。 更改为您的需要(gt(),gte(),eq(),lte(),lt())。

提示:

  • 始终对查询使用双引号。主义只接受单引号作为字符串值(单引号适合参数)。
  • 从不使用where(),始终以andWhere()orWhere()开头
  • Avoir可以同时使用andWhere()orWhere()。更喜欢expr()read more here
  • 避免将DQL与伪本地(LIKEIN等)SQL混合使用。如果教义读取了一些无法使用的本机SQL,它将使您大吃一惊。请改用expr()。如果在expr()中找不到所需的内容,则意味着您应该创建一个本机查询。
  • 完整命名您的别名,以便以后阅读。

[编辑]

这是我的答案给出的转储查询的屏幕截图。 我认为您尝试使我的查询适应您的代码,而不仅仅是复制/粘贴它。别名与我在查询中写的不匹配。

除了别名,我们可以看到子查询周围缺少一对括号。刚刚在我的答案中添加了它们。如果您复制/粘贴我的代码,希望它可以解决您的问题。