我想将数据库中存储的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中找到的行数。
提前致谢。
答案 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();