Je suis stack essayer de regrouper mes entités par datetime. Chaque entité a les colonnes suivantes: id, device, start, stop, ipaddress.(Symfony 3.1) des entités du Groupe Doctrine PHP par datetime
Je veux être en mesure d'obtenir des entités au sein d'une gamme de date et de les regrouper par date (jour) suivant avec combien d'heures chaque jour a.
C'est ce que j'ai jusqu'à présent
public function findAllGroupedByDate($from = null, $to = null)
{
$from = isset($from) && !is_null($from) ? $from : date('Y-m-d', time());
$to = isset($to) && !is_null($to) ? $to : date('Y-m-d', time());
$from = new \DateTime("-3 days");
$to = new \DateTime("1 days");
$from = date("Y-m-d", $from->getTimestamp());
$to = date("Y-m-d", $to->getTimestamp());
$q = $this->getEntityManager()->createQueryBuilder()
->select("timelog")
->from("AppBundle:Timelog", "timelog")
->where("timelog.start BETWEEN :from AND :to")
->setParameter("from", $from)
->setParameter("to", $to)
->orderBy("timelog.stop")
->getQuery();
return $q->getResult();
}
public function findFromToday()
{
$q = $this->createQueryBuilder('t')
->select('t.id', 't.start', 't.stop', 't.stop')
->where("t.start >= :today")
->setParameter("today", date('Y-m-d', time()))
->groupBy("t.id", "t.stop")
->orderBy("t.start", "asc")
->getQuery();
return $q->getResult();
}
Ceci est le code de ma classe référentiel.
et le code de mon contrôleur ressemble à ceci:
$timelogsRepo = $this->getDoctrine()->getRepository('AppBundle:Timelog');
// Grab logs from today
$timelogsCollection = $timelogsRepo->findFromToday();
$tmpLogs = $timelogsRepo->findAllGroupedByDate();
// THIS SECTION IS FOR CALCULATING HOURS & MINUTES
$minutes = 0;
$hours = 0;
foreach($timelogsCollection as $log)
{
$time1 = $log['start'];
$time2 = $log['stop'];
$interval = date_diff($time1, $time2);
$hours += $interval->h;
$minutes += $interval->i;
}
$minutes = $minutes >59 ? $minutes/60 : $minutes;
return $this->render(':Timelog:index.html.twig', [
'timelogs' => $logsOut,
'hours' => $hours,
'minutes' => $minutes
]);
i Jusqu'à présent, a pu calculer le temps total passé pour un jour donné (un seul jour). Maintenant, je voudrais obtenir toutes les entités, les regrouper par la même date (jour) et retourner les données avec intervalle.
exemple de tableau DB ressemble à ceci [id, device_id, démarrer, arrêter, ipaddress]
1 1 2016-08-09 09:00:06 2016-08-09 12:00:06 127.0.0.1
2 1 2016-08-08 07:00:00 2016-08-08 13:00:00 127.0.0.1
3 1 2016-08-08 13:10:00 2016-08-08 15:05:00 127.0.0.1
Donc dans ce cas ma sortie serait quelque chose comme:
[
0 => ["date" => "2016-08-09", "hours" => 9.00, "ipaddress" => "127.0.0.1"],
1 => ["date" => "2016-08-09", "hours" => 1.45, "ipaddress" => "127.0.0.1"]
]
l'intervalle dépend démarrer et arrêter les deux sont type de DateTime
J'ai essayé d'utiliser doctrine-extensions: oro/doctrine-extensions mais maintenant je reçois une erreur d'exception:
[2/2] QueryException: [Syntax Error] line 0, col 50: Error: Expected Unit is not valid for TIMESTAMPDIFF function. Supported units are: "MICROSECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, YEAR", got 'stop'
Ma méthode référentiel ressemble à ceci:
public function findByToday()
{
$fields = array(
'DATE(stop) as stop',
'TIME(SUM(TIMESTAMPDIFF(stop, start))) AS tdiff',
'device_id',
'ipaddress'
);
$q = $this->createQueryBuilder('t')
->select($fields)
->where('DATE(stop) = :today')
->setParameter('today', date('Y-m-d', time()))
->groupBy('device_id')
->getQuery();
return $q->getResult();
}
ma table DB:
id device_id start stop ipaddress
5 1 2016-08-09 09:00:06 2016-08-09 12:00:06 127.0.0.1
6 1 2016-08-08 07:00:00 2016-08-08 13:00:00 127.0.0.1
7 1 2016-08-08 13:10:00 2016-08-08 15:05:00 127.0.0.1
BTW j'utilise Symfony 3, pourrait-il être le problème?
Tomislav vous remercie de votre réponse, je vais essayer, vous permettra de savoir comment il a –
Salut Je l'ai essayé mais ne fonctionne toujours pas, maintenant je suis obtenir une erreur d'attente: [2/2] QueryException: [Erreur de syntaxe] ligne 0, col 50: Erreur: L'unité attendue n'est pas valide pour la fonction TIMESTAMPDIFF. Les unités prises en charge sont les suivantes: "MICROSECOND, SECOND, MINUTE, HEURE, JOUR, SEMAINE, MOIS, QUARTIER, ANNÉE", "stop" –
Copiez votre code ici. –