Sie sind nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: cms2day Forum - Community & Support rund ums cms2day. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

1

Donnerstag, 18. Dezember 2014, 19:38

OOP QueryBuilder by LK-Development

Hallo zusammen,

ich hatte heute einen sehr langen SQL-Query (weit mehr als 1000 Zeichen), da kam mir eine Idee. Einige von euch kennen sicher die großen PHP Frameworks ala Laravel, Symfony,Doctrine und co. Alle haben einen QueryBuilder dabei. Meist ist dieser aber tief im System drin, sodass man auch andere Teile nutzt als nur diesen Query Builder.
Deshalb hab ich mir fix eine Klasse geschrieben, die genau das für mich tut, also Querys "builden".

Beispiel:

MySQL-Abfrage(n)

1
SELECT b.bestellungID,b.bestellungDatum,p.p_name FROM `bestellungen` as b INNER JOIN `praemie` as p ON b.p_id = p.p_id WHERE b.bestellungID = :bid OR b.bestellungZeitraum > :timestampGestern

(ja gut so lang ist der Query jetzt nicht ;) aber Programmierer sind ja faul) Wer blickt denn da auf einen Blick durch? Kaum einer.
Deshalb sieht es bei mir so aus:

PHP-Quelltext

1
2
3
4
5
6
7
8
<?php
$queryBuilderSELECT = new lkdevelopment\QueryBuilder();
$queryBuilderSELECT->select("b.bestellungID""b.bestellungDatum","p.p_name")
                    ->from("bestellungen""b")
                    ->innerJoin("praemie""p""b.p_id = p.p_id")
                    ->where("b.bestellungID = :bid")
                    ->orWhere("b.bestellungZeitraum > :timestampGestern");
?>

Ahh das sieht doch schon mal viel einfacher aus ;) Und wenn ich mir nun $queryBuilderSELECT ausgeben lasse (vollkommen egal wie), steht da:

MySQL-Abfrage(n)

1
SELECT b.bestellungID,b.bestellungDatum,p.p_name FROM `bestellungen` as b INNER JOIN `praemie` as p ON b.p_id = p.p_id WHERE b.bestellungID = :bid OR b.bestellungZeitraum > :timestampGestern

Natürlich funktioniert das auch in der prepare Methode von mysqli oder PDO & in der mysql(i)_query Funktion.
Eine genaue Beschreibung & Dokumentation, genauso wie den Github Link (zum Download) findet ihr HIER.

Ich entwickle das ganze weiter, sodass es später einmal in der Lage ist direkt zu sagen ob die Spalte die angefordert wird überhaupt existiert und so weiter.

Mit freundlichen Grüßen
Lukas Kämmerling aka $this->getUser();

Werbung

2

Donnerstag, 18. Dezember 2014, 20:34

Hello,

Ich erlaube mir, mal langer Zeit mal wieder was zu schreiben und dann ist es auch gleich noch negativ. Bitte hasst mich nicht.

Ich gebe meine persönliche Meinung ab:
Ich erachte diese Klasse als (eventuell noch?) sinnlos. Es ergibt keinen Sinn, eine Klasse zu schreiben, in der man einen einfachen Query für eine relationale Datenbank in PHP-Syntax schreibt anstelle direkt per SQL.

Wenn tatsächlich ein komplexes SQL auf einem relationalem Modell geschrieben wird, wird immer zuerst die Query geschrieben und getestet. Erst dann wird das Query in die Programmlogik eingebunden und die Verarbeitung auf das Resultat entwickelt. Also warum sollte man die SQL-Syntax dann noch in die PHP-Syntax umschreiben?

Aus meiner Sicht ist die Syntax in PHP nicht einfacher wie direkt über SQL.

require_once 'QueryBuilder.class.php';
$queryBuilderSELECT = new lkdevelopment\QueryBuilder();
$queryBuilderSELECT->select("bestellungID", "bestellungDatum")->from("bestellungen", "b")->where("b.bestellungID = :bid")->groupBy("b.bestellDatum")->limit(1, 3);
echo $queryBuilderSELECT;

ist weder kürzer noch übersichtlicher als
SELECT bestellungID,bestellungDatum FROM `bestellungen` as b WHERE b.bestellungID = :bid GROUP BY b.bestellDatum LIMIT 1,3

---

Zum Vergleich zu den von dir genannten Frameworks: Doctrine zum Beispiel ist ein ORM. Das bedeutet, dessen Nutzen ist, dass ein Objektmodell in ein relationales Modell gespeichert und wieder geladen werden kann. Es dient nicht dazu, ein einfaches Statement auf einem relationalem Modell zu bilden sondern es transformiert die objektorientierte Welt in die relationale Welt.

Nichts für ungut, nur eine bescheidene Meinung.

Cheers,
Prime

Werbung

cms2day

Profi

  • »cms2day« ist männlich

Beiträge: 1 282

CMS Version: 4.x/5.x

Beruf: Webentwickler

Paypal:

  • Nachricht senden

3

Donnerstag, 18. Dezember 2014, 23:54

Muss ich mich Prime anschließen. Wenn OOP oder auch nur irgendwo in die Richtung, dann richtig. Und genau aus diesem Grund baut cms2day 5 auch noch auf die alte Variante, da der Aufwand viel zu enorm wäre, alles umzuschreiben. Was bringt es da, so was zu nutzen? Meiner Meinung nach auch etwas sinnlos.

?(

Werbung

4

Freitag, 19. Dezember 2014, 07:29

Nun, Geschmack liegt bekanntlich im Auge des Betrachters. Eigentlich hat die Klasse auch noch einen weiteren Zweg, da sie auch zeitgleich für das Ausführen der Querys zuständig ist. Das habe ich hier aber bewusst mal raus genommen.
Wenn tatsächlich ein komplexes SQL auf einem relationalem Modell geschrieben wird, wird immer zuerst die Query geschrieben und getestet. Erst dann wird das Query in die Programmlogik eingebunden und die Verarbeitung auf das Resultat entwickelt. Also warum sollte man die SQL-Syntax dann noch in die PHP-Syntax umschreiben?

Weil er einfacher zu lesen ist bzw. schneller. Ich habe das ganze bei mir in der Firma getestet. Ich habe unseren lieben Praktikanten beide varianten gezeigt, ebenso unserem Master Webdeveloper, beide meinten, dass es wesentlich einfacher zu lesen ist bei komplexen Querys. Das System wird allerdings noch weiter wachsen, u.a ist angedacht eine art "Cache" zu machen, für Werte die sich nicht all zu oft ändern um die Datenbank zu "schonen" (wobei ihr das ja eigentlich wurscht ist).
Zum Vergleich zu den von dir genannten Frameworks: Doctrine zum Beispiel ist ein ORM. Das bedeutet, dessen Nutzen ist, dass ein Objektmodell in ein relationales Modell gespeichert und wieder geladen werden kann. Es dient nicht dazu, ein einfaches Statement auf einem relationalem Modell zu bilden sondern es transformiert die objektorientierte Welt in die relationale Welt.

Das ist mir auch durchaus bewusst, genau so macht es ja auch das Entitiy Framework in .NET. Es war aber auch nie die Rede davon, dass das hier ein ORM werden soll. Es bringt nur kleinere Vorteile von einem ORM (z.b. das einfache und verständliche Bauen von Querys), ohne ein komplettes Modul aus z.b. Doctrine rauslösen zu müssen.

Werbung

Rouven

Anfänger

Beiträge: 46

Wohnort: Köthen (Anhalt)

  • Nachricht senden

5

Freitag, 19. Dezember 2014, 13:48

Ich denke, dass es auf der einen Seite eine wirklich tolle Idee ist und Du auch daran bleiben solltest,
jedoch für Cms2Day ist dies einfach nicht von Nützen...

Werbung

6

Samstag, 20. Dezember 2014, 11:34

Nun, Geschmack liegt bekanntlich im Auge des Betrachters. Eigentlich hat die Klasse auch noch einen weiteren Zweg, da sie auch zeitgleich für das Ausführen der Querys zuständig ist. Das habe ich hier aber bewusst mal raus genommen.


Dies lässt sich auch ohne diese Klasse mit den Bordmitteln von PHP realisieren - Deshalb sehe ich auch hier keinen Vorteil. Sinnvoll wäre es, wenn dies Datenbankunabhängig wäre, das heisst einen richtigen DB-Layer.

Weil er einfacher zu lesen ist bzw. schneller [...]


Auf diese Aussage möchte ich dich zitieren: "Nun, Geschmack liegt bekanntlich im Auge des Betrachters." Ich erachte diese Schreibart als weder lesbarer noch schneller. Bei den Beispielen sind es die einfachsten zu schreibenden Queries. Sobald die Queries komplexer werden (z.B. mit verarschalteten Subselects, Exist-Statements oder mit Unions oder gar case-statements) würde das meines Erachtens noch klarer werden.

Es bringt nur kleinere Vorteile von einem ORM (z.b. das einfache und verständliche Bauen von Querys)


Dies ist aus meiner Sicht keines der "kleineren" Vorteile eines ORMs. Ein ORM hat eine Aufgabe - Das Mapping zwischen OOM und RM. Das Bauen von Queries ist hierbei lediglich eine Begleiterscheinung.

Werbung

emet

Admin & Support

  • »emet« ist männlich

Beiträge: 2 530

Wohnort: Rhein/Main

Paypal:

  • Nachricht senden

7

Samstag, 20. Dezember 2014, 17:19

Nun, für uns bleibt es, wie Matze es schon gesagt hat in der alten Variante - Oldschool.

Prime kennt den Verlauf der Entwicklung und auch die Beweggründe.

Es arbeiten nicht nur Profis in Agenturen mit cms2day, sondern auch User mit "PHP Kenntnissen".

Diesen ist der bisherige Aufbau von cms2day schon immer sehr entgegengekommen, da diese mehr damit anfangen konnten, bei evtl eigenen Anpassungen oder Modulen.

Auch die Profis und die der Agenturen lieben die übersichtlichen Funktionen und den Quellcode.

Schon vor langem hatten wir darüber diskutiert, sind trotzdem weiter den alten Pfad gegangen und er wird dankbar angenommen und auch nur positiv bewertet.

Alt Bewertes hat immer noch seinen Bestand und auch seine Begründung. Es ist deswegen ja nicht schlechter. Nur anders und warum sollten wir nicht anders sein.

Wie schon erwähnt ist Alles Geschmackssache.
.
HTML, was ist das? Ein neues Männermagazin? Css.., was es so alles gibt!

News: http://www.cms2day.de/news/1/
Features: http://www.cms2day.de/cms-funktionen/

Zufrieden mit cms2day und unserer Arbeit/Support - Spenden (-Button links) sind herzlich Willkommen - Dankeschön.
.

Werbung