【问题标题】:Doctrine setParameter always produces "?"教义 setParameter 总是产生“?”
【发布时间】:2021-07-25 06:25:34
【问题描述】:

我想将日期时间值(来自数据库)与当前时间进行比较,并检查当前时间是在数据库中的值之前还是之后。这是在 Symfony 项目中完成的。我尝试关注instructions on the Symfony website。

所以我在 Repository Class 中编写了以下 Doctrine 查询,它检查用户锁定时间并检查它是否仍在未来:

 $user_id = 1; // Just giving $user_id a value for this example     
 $qb = $this->createQueryBuilder('user')
        ->andWhere('user.lockout_time > :time')
        ->setParameter('time', date("Y-m-d H:i:s"))
        ->andWhere('user.user_id = :user_id')
        ->setParameter('user_id', $user_id);
    
 $query = $qb->getQuery();
 echo $query->getSQL();
 die;

运行时,两个 Where 子句的比较值都包含“?”(例如WHERE user.lockout_time > ?)。显然我希望在查询中使用实际值。

最初我认为 date() 函数可能是问题所在,但即使我只使用 :user_id 也会出现上述错误。

如果我写 ->andWhere('user.user_id = 1') 我会得到想要的结果。

如果我将 :time 替换为 'Ymd H:i:s' 格式的某个日期,我会收到消息“错误:预期结束string..."(其中 ... 是 Hour 的值)。

所以我的两个 setParameter() 行都没有传递其中设置的值。我忽略了什么?

编辑: 建议的问题here 不是重复的。这只是帮助我查看发送的查询。这对准备这个问题很有帮助。

【问题讨论】:

  • 另外,您可能应该使用->setParameter('time', new \DateTime()) 对象学说来来回转换此字段。 setParameter 方法会将其转换为已配置数据库的正确值。
  • @ArleighHix 谢谢。我在发这个之前就找到了。它帮助我得出结论,只有“?”是命名占位符的输出。也感谢您提供新 \DateTime() 的提示。这是我尝试过的事情之一,但无济于事。我在我的代码中把它改回来了。

标签: symfony doctrine query-builder


【解决方案1】:

因此,经过一番(= 太多)时间的挖掘,这里是我自己的答案。

“?”是转义值,并不代表查询中的实际内容(这是上述链接没有帮助的另一个原因)。为了解决这个问题,我求助于监控 MySQL 常规日志。

Here how to get to it,如果有人有同样的问题。此日志显示实际 SQL 查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    相关资源
    最近更新 更多