Doctrine删除最旧的条目

时间:2016-01-21 09:55:45

标签: php mongodb symfony orm doctrine-orm

我有一个包含3个字段messageauthorsendAt的MongoDb文档,我创建了一个查询构建器来计算此文档中的所有数据库条目,如果有超过20个条目,我试图删除最旧的条目。

sendAt是发送邮件时的当前日期时间("sendAt" : ISODate("2016-01-21T08:53:00Z")

我有一个未完成的查询构建器

public function deleteOldestMessage()
{
    return $this->createQueryBuilder()
        ->delete('m')
        ->from('Messages', 'm')
        ->where('m.sendAt = ')
        ->execute();
}

但我真的不知道我应该在where条件下添加什么。 我应该订购DESC sendAt字段并删除列表中的第一个字段?

如何告诉查询构建器删除最旧的那个?

谢谢,

3 个答案:

答案 0 :(得分:3)

首先需要选择最旧的一个,然后就可以删除它:

    $qb->select('m')
   ->from('Messages', 'm')
   ->orderBy('m.sendAt', 'DESC'); 
   $messages = $qb->getResult();

thene

    if(count($messages) >= 20){
        //get the first element of array which is the oldest one
        $lastMessage = current($messages); 
        $em->remove($lastMessage);
    }

答案 1 :(得分:2)

您使用sql查询构建器选项而不是mongodb。

return $this->createQueryBuilder()
    ->remove()
    ->sort('sendAt', 'asc')
    ->getQuery()
    ->getSingleResult()
    ->execute();

答案 2 :(得分:2)

您可以尝试以下内容:

$qb = $em->createQueryBuilder();
$messages = $qb->select('m')
    ->from('Messages', 'm')
    ->orderBy('m.sendAt', 'ASC')
    ->getQuery()
    ->getResult()
;
// You will receive array where in the top will be the oldest message.
if (count($messages) > 20) {
    // And in your desired case, you can remove just one oldest message.
    $messageToDelete = array_shift($messages);
    $em->remove($lastMessage);
    $em->flush();
}