Symfony2在控制器中的新sql查询

时间:2014-09-29 09:02:59

标签: sql database symfony controller

我想在控制器中使用SQL从我的数据库中选择一些东西。

我想从数据库中获取过去12小时内的所有活动。

这是我的控制器代码:

public function SendDailyReportAction(Request $request){
        $em = $this->getDoctrine()->getManager();
        $query = $em->createQuery("SELECT * FROM MainCoreBundle:Event WHERE added_on >= DATE_SUB(NOW(), INTERVAL 12 HOUR)");
        $statement = $query->getResult();

        var_dump($statement);

        return $this->render('MainAdminBundle:Reports:index.html.twig');

    }

我做错了什么?选择全部(*)的替代方案是什么? 我是否写过实体的好路径?

ERROR:

[Syntax Error] line 0, col 7: Error: Expected IdentificationVariable | ScalarExpression | AggregateExpression | FunctionDeclaration | PartialObjectExpression | "(" Subselect ")" | CaseExpression, got '*'

我决定这样做:

 public function SendDailyReportAction(Request $request){
        $em = $this->getDoctrine()->getManager();
        $query = $em->createQuery("SELECT e FROM MainCoreBundle:Event e WHERE e.date >= DATE_SUB(CURRENT_DATE(), 4, 'MONTH')");
        $statement = $query->getResult();

        var_dump($statement);

        return $this->render('MainAdminBundle:Reports:index.html.twig');

    }

我改变了什么:

  • DATE_SUB(NOW()到DATE_SUB(CURRENT_DATE()

并添加为@JoëlSalamin说别名 e。

2 个答案:

答案 0 :(得分:2)

首先,我建议您将DQL放入Repository类中,以保证代码整洁。但要回答您的问题,请执行以下操作:

    $em = $this->getDoctrine()->getManager();
    $qb = $em->createQueryBuilder();

    $results = $qb->select('e')
                  ->from('MainCoreBundle:Event','e')
                  ->where('e.addedOn >= :datetime')
                  ->setParameter('datetime', new \DateTime('-12 hours'))
                  ->getQuery()
                  ->getOneOrNullResult();

     return [compact('results')];

答案 1 :(得分:0)

以下是您的查询,其中包含一些更正:

...
$query = $em->createQuery("SELECT e FROM MainCoreBundle:Event e WHERE e.added_on >= DATE_SUB(NOW(), INTERVAL 12 HOUR)");
...

希望这会对你有所帮助。

PS:看一看:Doctrine - Querying for objects using Query Builder。这可以极大地帮助您使用Doctrine Query Builder的强大功能查询数据库。