Doctrine 查询生成器删除 x 天前创建的对象

Doctrine query builder remove objects created x days ago

我正在尝试提出一个查询,用于删除特定 table 中从今天 $xDaysAgo 天前创建的对象(今天的日期是使用新的 dateTime 对象创建的).

所以在我的数据库中我会

id | created_at | name

5  | 2020-01-01 12:00:00 | test
6  | 2020-04-09 15:00:00 | test1
7  | 2020-04-11 15:00:00 | test2

然后我选择 $xDaysAgo5 然后我的方法 removeObject($xDaysAgo) 应该只删除 ID 为 67 的对象(因为今天是 11 号)。 有人告诉我,使用 queryBuilder 您可以直接对对象进行排序并直接删除满足条件的对象。但是我找不到一个例子来证明这一点。我设法实现了一个简单的功能,但不是我想要的。我现在有这个来删除一组对象,但它没有考虑日期:

    public function removeObject(array $objectIds)
    {
        $qb = $this->getEntityManager()
            ->getConnection()
            ->createQueryBuilder()
            ->delete('someTable');
        $qb->add('where', $qb->expr()->in('id', $objectIds));
        $qb->execute();
    }

这似乎工作正常。我似乎无法编辑它来实现我真正想要的。任何帮助将不胜感激!

我的最终方法应该是这样的(这是一些应该更改的细节,而不是通过一段工作代码):

    public function removeObject(int $xDaysAgo)
    {
        $qb = $this->getEntityManager()
            ->getConnection()
            ->createQueryBuilder()
            ->delete('someTable');
        //order them using created_at and then delete those seems better than looping throw all of them??
        $qb->add('orderBy', $qb->expr()->in('created_at', $xDaysAgo));
        $qb->execute();
    }

我不确定是否理解您的问题。

您想删除恰好在今天 x 天前创建的实体吗? 如果这是您想要的,您可以直接删除第 (x) 天和第 (x+1) 天之间创建的实体。

  $begin = new DateTimeImmutable('-5 days');
  $end = new DateTimeImmutable('-6 days');

  //If you want to fix a day, you should use:
  //$begin = (new DateTime('-5 days'))->setTime(0,0,0);
  //$end = (new DateTime('-5 days'))->setTime(23,59,59);

  $qb = $this->getEntityManager()
     ->getConnection()
     ->createQueryBuilder()
     ->delete('someTable')
     ->where('createdAt between :end and :begin')
     ->setParameter('begin', $begin)
     ->setParameter('end', $end);