Я выполнил запрос с помощью построителя запросов доктрины, который собирает всех студентов, которые перешли на X этап X дней назад.
Код выглядит так:
$date = Carbon::today()->subDay($days);
$qb = $this->createQueryBuilder('s');
$qb->innerJoin('s.currentPDPStudentStageEntry','c', 'WITH', $qb->expr()->andX(
$qb->expr()->eq('c.pdpStudentStage.stage', ':stage'),
$qb->expr()->gt('c.createdAt', ':date1'),
$qb->expr()->lte('c.createdAt', ':date2')
))->setParameters([
'stage' => $stage,
'date1' => $date->format('Y-m-d H:i:s'),
'date2' => $date->addDay(1)->format('Y-m-d H:i:s')]);
return $qb->getQuery()->getResult();
Теперь дело в том, что бизнес-логика изменилась.
Я должен проверить, является ли последнее взаимодействие учащегося с системой более поздним, чем смена этапа, в этом случае отсчет должен начаться там.
Вот пример:
$stage = 'enrolled'
$days = 21;
Приведите ко мне всех студентов, которые перешли на сцену {$stage}
{$days}
дней назад. НО, если учащийся взаимодействовал с системой позднее, чем смена даты этапа, рассчитайте {$days}
дней от даты этого взаимодействия.
Примечание. Взаимодействие - это объект, связанный отношением ownToMany.
$this->interactions = new ArrayCollection()
Прежде всего я хотел бы узнать, возможно ли это с помощью построителя запросов, и иметьИдея, как будет выглядеть код. Если нет, то как будет sql, так как я тоже не знаю, как это sql.
Большое спасибо