Symfony2:将存储的日期时间对象与当前日期与doctrine进行比较

时间:2016-08-09 08:44:20

标签: mysql symfony datetime doctrine

我想将数据库中存储的DateTime条目与使用Doctrine的当前日期进行比较。

我有一个Key列表及其与Person的关系。我现在的目标是为可用密钥或不可用密钥创建一个列表。

为此,我必须查看2个表,键和personToKey。其中personToKey有一个字段rueckgabe(返回密钥的时间)(dateTime)和一个字段键(密钥的存储id),其中OneToMany关系为表键的字段id。

感谢这里的一些搜索,我得到了一个正在运行的SQL查询,它给了我正在寻找的值。 SQL查询:

 SELECT * FROM key LEFT OUTER JOIN personToKey on key.id = personToKey.KeyId 
  WHERE personToKey.rueckgabe < NOW()

现在我的问题是,我不能使用原则来解决这个问题。我有两种方法。

  $qb = $em->createQueryBuilder();
  $query = $qb->select('k')
  ->from('MyBundle:key', 'k')
  ->leftjoin('MyBundle:personToKey', 'ptk','WITH', 's.id = ptk.key')
  ->where('ptk.rueckgabe < :date_now')
  ->setParameter('date_now', date('Y-m-d H:i:m'))
  ->getQuery();
  $test = $query->getResult();

$sql = 'SELECT k FROM MyBundle:key k LEFT OUTER JOIN MyBundle:PersonToKey ptk WITH k.id = ptk.key WHERE ( ptk.rueckgabe < CURRENT_DATE()) ';
$query = $em->createQuery($sql);
$test = $query->getResult();

由于SQL查询有效,我认为至少第二种方法应该有效。但在这两种情况下,我得到以下结果:

对于ptk.rueckgabe&gt; =:date_now列表没问题,但对于ptk.rueckgabe&lt; :date_now我得到了可用键和不可用键的混合。此外,结果的长度低于SQL Query在PHPMyAdmin中找到的行数。

提前致谢。

2 个答案:

答案 0 :(得分:0)

正如答案here所述:

  

相当于MySQL的NOW()是Doctrine DQL&#39 {s} {/ 1}}。

     

CURRENT_TIMESTAMP()仅返回日期部分。

这可能解释了为什么第二种方法没有提供与运行直接SQL查询相同的结果。

对于第一种方法,您可以尝试以下方法,即使我不确定它是否会产生影响:

CURRENT_DATE()

修改 我在QueryBuilder中发现了另一个潜在的问题: 而不是

->setParameter('date_now', new \DateTime())

你可以尝试写:

->leftjoin('MyBundle:personToKey', 'ptk','WITH', 's.id = ptk.key')

s .id肯定是错的,不确定其余部分。

答案 1 :(得分:0)

我终于为我的问题找到了一个可行的解决方案,所以我想分享它,如果其他人有类似的问题。

  $now = new \DateTime() ;
  $now1=$now->format('Y-m-d H:i:s');
  $sql = 'SELECT * FROM key AS k
    LEFT OUTER JOIN persontoKey AS ptk ON k.id = ptk.keyId
    WHERE ( ptk.rueckgabe < :now ) ';
  $em = $this->getDoctrine()->getManager();
  $stmt = $em->getConnection()->prepare($sql);
  $stmt->bindValue('now', $now1, \PDO::PARAM_STR);
  $stmt->execute();
  $helper= $stmt->fetchAll();