原则查询生成器 ~ 日期时间

2022-08-31 01:04:38

我试图在symfony2 / doctrine 2中创建一个简单的聊天框。

为了进行测试,我每5秒检查一次新消息,因此在我的查询中,我尝试通过获取日期时间大于当前时间减去5秒的所有消息来获取所有消息。

我尝试通过以下方式执行此操作,但它返回数据库中的所有消息,而不是过去5秒内发布的消息。

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

$qb = $em->createQueryBuilder();
$qb->select('m')
                 ->from('ChatboxBundle:ChatMessage', 'm')
                 ->where(':new > :last')
                 ->setParameter('new', 'm.postdate' )
                 ->setParameter('last', new \DateTime('-5 second'), \Doctrine\DBAL\Types\Type::DATETIME);
$updatedata = $qb->getQuery()->getResult();

关于我做错了什么的任何想法?


答案 1

m.postdate是字段名称,因此不应作为参数传入。试试这个

$qb = $em->createQueryBuilder();
$qb->select('m')
                 ->from('ChatboxBundle:ChatMessage', 'm')
                 ->where('m.postdate > :last')
                 ->setParameter('last', new \DateTime('-5 second'), \Doctrine\DBAL\Types\Type::DATETIME);
$updatedata = $qb->getQuery()->getResult();

答案 2

请注意,您不需要使用\Doctrine\DBAL\Types\Type::D ATETIME

文档说:调用 setParameter() 会自动推断出您将哪种类型设置为值。这适用于整数、字符串/整数数组、DateTime 实例和托管实体。如果要显式设置类型,可以调用第三个参数来显式设置Parameter()。它接受 PDO 类型或 DBAL 类型名称进行转换。


推荐