Doctrine orm 使用DQL仅保留最新记录

Doctrine orm 使用DQL仅保留最新记录,doctrine-orm,symfony4,Doctrine Orm,Symfony4,我有一个symfony应用程序,里面有条令。有一张像这样的桌子: +----+-----------+----+ |用户|日志|日期| foo| +-----+-----------+----+ |约翰| 2018-03-20 22:59:18 | 58| |凯尔| 2018-04-11 13:45:02 | 22| |保罗| 2018-11-08 22:19:16 | 41| |凯尔2018-08-1409:39:26| |弗雷德| 2018-03-28 06:08:31 | 24| |约翰|

我有一个symfony应用程序,里面有条令。有一张像这样的桌子:

+----+-----------+----+ |用户|日志|日期| foo| +-----+-----------+----+ |约翰| 2018-03-20 22:59:18 | 58| |凯尔| 2018-04-11 13:45:02 | 22| |保罗| 2018-11-08 22:19:16 | 41| |凯尔2018-08-1409:39:26| |弗雷德| 2018-03-28 06:08:31 | 24| |约翰| 2018-01-21 11:52:17 | 81| | ... | ... | ... | +-----+-----------+----+


cron应该执行symfony命令删除所有记录,但保留每个用户的最新10条记录。这可以使用DQL完成吗?还是必须使用SQL子查询?

我认为在实体存储库中类似这样的东西可以为用户获取除最后10个之外的所有条目

public function getAllExceptLatest($user)
{
    return $this
        ->createQueryBuilder('t')
        ->andWhere('t.logDate <= :logDate')
        ->orderBy('t.logDate', 'DESC')
        ->setParameter(':logDate', $this->getLatestDate($user))
        ->setFirstResult(10)
        ->getQuery()
        ->execute();
}

public function getLatestDate($user)
{
    return $this->createQueryBuilder('e')
        ->select('MAX(e.logDate)')
        ->andWhere('e.user = :user')
        ->setParameter(':user', $user)
        ->getQuery()
        ->getSingleScalarResult();
}

我没有对此进行测试,但在我的应用程序中,类似的方法效果很好

您尝试了什么?
   public function keepLatest(){
        $em = $this->getDoctrine()->getManager();
        $userRepo = $em->getRepository(User::class);

        $users = $userRepo->findAll();
        foreach ($users as $u) {
            $records = $userRepo->getAllExceptLatest($u);
            foreach ($records as $r)
            $em->remove($r);
        }
        $em->flush();
    }