📄 Anfragen

Aufgabe: Fake Daten unter Dashboard mit echten Anfragen aus der Datenbank füttern.

Lösung von Peter / update Version

Erste schritte. Zugriff auf Datenbank mit Doctrine. Info.

Wir greifen deshalb unter Symfony auf Doctrine zu. Doctrine ist ein ORM (Objekt-relationales Mapping) Framework und hilft uns, die Datenbanktabellen in der Datenbank durch PHP-Klassen zu verknüpfen und zuzugreifen. Im Ordner src/Entity werden die PHP-Klassen, mit den jeweiligen Datenbanktabellen per objektorientierter Weise verbunden. Was hier schon passiert ist, wir müssen nichts tun.

Weitere Informationen / Link: https://www.doctrine-project.org/projects/doctrine-orm/en/3.1/reference/working-with-objects.html


Unter Anfrage.php können wir sehen, wie mit setter und getter functionen, auf die Datenbanktabelle/anfrage per php verknüpft wird. 


phpMyAdmin


Zum Code:

Einbindung der AnfrageRepository in DashboardController.php, um später mit der Repository die Datenbank zuzugreifen.​  Ein Repository ist eine spezielle Klasse, die für den Datenzugriff und die Verwaltung von Datenbank verantwortlich ist.

Die AnfrageRepository.php nutzen und die Verbindung vorbereiten.


Wie greif man per Doctrine auf die Daten?

Per Doctrine QueryBuilder, welche komplexe sql in dql-Abfragen zusammensetzt.


Innerhalb der function wird ein QueryBuilder erstellt. Als 'a' definiert.

$this->createQueryBuilder('a') und gleich der Variable $e_Anfragen zugewiesen.

Mit ->getQuery() greifen wir auf die ganzen Daten in der Datenbank der Klasse Anfrage zu. Sozusagen auf die ganze Datenbank Tabelle anfrage in hinschg.

​Wir setzen mit ->setParameter, die Parameter für die Begrenzung, welche wir per StartDatum und EndDatum definieren. Die wir später noch in eine function im DashboardController.php definieren. 


In gewisser Weise schränken wir den Zeitraum ein, aus dem die Daten stammen. Kurz: Keine Daten außerhalb 6 Monate und älter. 

​Mit ->where und ->andWhere setzen, wo wir welche Spalte in der Datenbank begrenzen wollen. Hier creation_date und >= größer als startDate oder kleiner als <= endDate. Alle Anfragen, die außerhalb der definierten Größe der creation_date liegen, werden ​ausgefiltert.​

​GetResult gibt das Resultat in ein Objekt Array mit allen Anfragen von der PHP-Klasse Anfrage von innerhalb ​StartDate und EndDate zurück.


Weitere Informationen / Link: https://www.doctrine-project.org/projects/doctrine-orm/en/3.1/reference/query-builder.html


Objekt Array weiter begrenzen.

Da alle Information in der Query gespeichert sind und wir nur die Id und das Date brauchen, müssen wir die unnötigen Informationen kürzen und entfernen. Kurz nochmal mit ->getQuery() erhalten wir alle Spalten der ganzen Tabelle der anfrage Datenbank. Deshalb begrenzen wir nicht nur den Zeitraum, siehe oben, sondern auch wo, die Spalten, hier Id und creation_date. 

Wir machen dies in eine function in AnfrageRepository.php.


Mit get function beschränken wir den Zugriff auf die Id und das Datum im creation_date.

Durch eine weitere foreach Schleife, die durch alle $anfragen durch geht. Werden die Daten mit if, wenn die Daten übereinstimmen, vereinfach. Zurzeit sieht so aus = $date: 2023-12-01 00:00:00.0 UTC (+00:00) und soll vereinfacht werden zu  [ "month" =>12, "year"' = 2023].

Da $date ein genaueres Datum erzeugt, siehe oben und die id getrennt ist und das wir später vergleichen wollen, vereinfachen wir die Daten wieder, fügen sie grob in einem assoziativen Array zusammen. 

// Ein assoziatives Array ist eine Art von Datenstruktur, die Paare von Schlüsseln und Werten speichert. Anstatt wie bei normalen Arrays die Werte mit Zahlenindizes zu referenzieren, verwendet man hier benutzerdefinierte Schlüssel.  

Hier ist die Id, um die Daten zu überprüfen und zu identifizieren. 

array: [2023-12-01 00:00:00.0 UTC (+00:00)]


zu

array: 228 => array:2 [ "month" =>12, "year"' = 2023]


Mit $associativeArray können wir nun die Monate und Jahre in einfacherer Weise miteinander vergleichen

//tipp mit 

​dd($Variable1, $Variable2);

debuggen und das array auf den Browser anzeigen, Alternative var_dump oder dump

Datenbank abrufen


Mit der Datenbankabruf beginn der Prozess. Wir greifen auf die function aggregateAnfragen zu.

Zählen / 'count'


Wir laden unter $methodName, die übergebene methodenNamen. z.B. 'findEingegangeneAnfragen' und die aktuelle $lastSixMonth (die letzten 6 Monate) welche wir, in eine andere function ausgelagert haben. 

Wir verwenden $lastSixMonths, um das aktuelle Datum zu erzeugen und als Referenz als Vergleich herzuleiten. 

Gibt es einen Treffer, wir die $count Variable durch count um 1 erhöht. 


Zusammengefasst: Mit der $anfragen verbinden wir die Datenbank und greifen durch anfrageRepository zu. Was wiederum die function createAssociativeArray aktiviert. 


return $this-createAssociativeArray

Die Daten die durch anfrageRepository von Datenbank kommen werden durch createAssociativeArray vereinfach.


und mit den ähnlichen aufgebauten $LastSixMonths 


verglichen und ein Treffer erzeugt, wenn sie gleich sind. Den 'count' erhöht und ein neues Array $counts[key] verbunden.


 

Da wir nur 'count' benötigen und die Anfragen im Dashboard nur Zahlen ausgeben sollen. Teilen wir wieder das assoziative Array wieder in einzelne 'count' Objekte auf per array_values, zurück zur numerische array. 


Dies vereinfach, die Darstellung und durchlauf durch eine Schleife.  



Die Count in die Chart.js einfügen.


Die Count für den Twig Seite vorbereiten für das Rendern.


//  Twig ist eine moderne Template-Engine für PHP, die entwickelt wurde, um die Erstellung von HTML-Ausgaben zu erleichtern und zu strukturieren.

Twig / templates


In index.html.twig. Mit for Schleife die Array | length durchgehen und Darstellen.

Beispiel monthLabels, die Monate Label: