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
然后我选择 $xDaysAgo
为 5
然后我的方法 removeObject($xDaysAgo)
应该只删除 ID 为 6
和 7
的对象(因为今天是 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);
我正在尝试提出一个查询,用于删除特定 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
然后我选择 $xDaysAgo
为 5
然后我的方法 removeObject($xDaysAgo)
应该只删除 ID 为 6
和 7
的对象(因为今天是 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);