Doctrine построитель запросов удаляет объекты, созданные х дней назад - PullRequest
2 голосов
/ 11 апреля 2020

Я пытаюсь найти запрос для удаления объектов в таблице specfi c, которые были созданы $xDaysAgo days a go from today (сегодняшняя дата создается с использованием нового объекта 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) будет удалять только объекты с идентификатором 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();
    }

Что, кажется, работает нормально. Я не могу изменить это, чтобы добиться того, чего я действительно хочу. Мы будем благодарны за любую помощь!

мой последний метод должен быть примерно таким (это c некоторые детали, которые должны быть изменены, а не рабочий код):

    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();
    }

1 Ответ

1 голос
/ 11 апреля 2020

Я не уверен, что понимаю ваш вопрос.

Вы хотите удалить объекты, созданные ровно за 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);
...