DQL不接受约会

时间:2017-03-02 09:49:40

标签: php mysql doctrine-orm symfony mariadb

我有这个存储库功能来选择与特定日期内的图像拟合相关的所有投票:

public function getTopNImages(int $n)
    {

        $date = date_format(new \DateTime('first day of this month'), 'Y-m-d H:i:s');

        var_dump($date);

        $q2 = $this->createQueryBuilder('aliasi2')
            ->select('count(v.id)')
            ->innerJoin('aliasi2.votes', 'v')
            ->where('aliasi2 = i')
            ->andwhere("date_diff(v.date, $date) >= 0");

        return $this->createQueryBuilder('i')
            ->select(array(
                'i',
                '(' . $q2->getDQL() .') votes' 
            ))
            ->orderBy('votes', 'DESC')
            ->setMaxResults($n)
            ->getQuery()
            ->getResult();
    }

我使用的日期格式与mysql中的日期格式相同,var_dump输出:

  

string(19)“2017-03-01 09:39:34”

但由于某种原因,我得到了这个:

  

[语法错误]第0行,第137行:错误:预期的Doctrine \ ORM \ Query \ Lexer :: T_CLOSE_PARENTHESIS,得到' - '

这可能是什么问题?

2 个答案:

答案 0 :(得分:4)

你忘了用简单的引号保护你的日期,所以词法分析器在第一个' - '时失败了。

在此处查看问题:

"date_diff(v.date, 2017-03-01 09:39:34) >= 0"

你需要这样做:

"date_diff(v.date, '$date') >= 0"

甚至更好地使用setParameter()

答案 1 :(得分:1)

你试过这个:

$q2 = $this->createQueryBuilder('aliasi2')
        ->select('count(v.id)')
        ->innerJoin('aliasi2.votes', 'v')
        ->where('aliasi2 = i')
        ->andwhere("date_diff(v.date, :date) >= 0")
        ->setParameter('date', $date);

仅设置日期参数...