我在执行查询时遇到问题,当我尝试进行子查询时出现此错误消息
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“
答案 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()
开头andWhere()
和orWhere()
。更喜欢expr()
(read more here)LIKE
,IN
等)SQL混合使用。如果教义读取了一些无法使用的本机SQL,它将使您大吃一惊。请改用expr()
。如果在expr()
中找不到所需的内容,则意味着您应该创建一个本机查询。[编辑]
这是我的答案给出的转储查询的屏幕截图。 我认为您尝试使我的查询适应您的代码,而不仅仅是复制/粘贴它。别名与我在查询中写的不匹配。
除了别名,我们可以看到子查询周围缺少一对括号。刚刚在我的答案中添加了它们。如果您复制/粘贴我的代码,希望它可以解决您的问题。