Mit Propel über LEFT JOIN nicht vorhandene Einträge via IS NULL finden, so gehts

Manchmal braucht man aus der Datenbank die Information darüber, welche Angaben bzw. Beziehungen nicht existieren. In der Propel ORM Dokumentation wird mit dem Beispiel eines Buchladens mit Autoren und Büchern gearbeitet. Daher nehme ich hier gerne auch einmal das Beispiel auf:

Wir wollen also einmal ermitteln welche Autoren keine Bücher haben.

Über reines SQL würde das so aussehen:

Über Propel ist diese SQL ganz einfach zu realisieren:

Dieses Beispiel funktioniert natürlich nur, wenn über das Schema über foreign-keys eine Beziehung (relation) zwischen den beiden Tabellen hergestellt wurde, stellt dann aber die einfachste Art der Abfrage dar und ist zudem noch sehr schön und einfach zu lesen.

Natürlich kann man ein LEFT JOIN aber auch „zu Fuß“ darstellen. Diese Variante funktioniert auch wenn keine direkten Beziehungen der Tabellen über das Schema definiert wurden:


Wichtiger Hinweis: Ich rate (derzeit) von der Nutzung des „Alias“ Parameters in den leftJoinXxx() Methoden ab, da dieser beim Bauen der SQL Abfrage teilweise ein CROSS JOIN in die Abfrage einbaut (in MySQL ein Alias für INNER JOIN) und genau dieser Join-Typ soll es ja eben nicht sein. Im Zweifel immer einmal die Abfrage debuggen. Das ist in Propel über die toString() Methode sehr einfach. Wichtig ist jedoch, dass Ihr die Abfrage über die abschließenden Methoden wie find(), findOne(), etc. nicht schon ausgeführt habt. Hier ein Beispiel:


Noch ein Tipp zum Schluss: Manchmal sind die Abfragen natürlich ein wenig komplexer. Man kann über Propel so ziemlich jede SQL Abfrage nachbauen, so kann man beispielsweise die Join-Bedingungen natürlich auch ganz einfach erweitern:


Als Schema Vorlage habe ich das altuelle Original Beispiel-Schema direkt von der Propel Builttime Seite genommen. Für den Fall, dass sich dieses einmal ändern sollte, füge ich es diesem Beitrag einmal an:

Ich hoffe dieser Beitrag ist für Euch hilfreich. Wenn ja oder Ihr es anders handhabt, schreibt mir natürlich gerne!

 

Ähnliche Beiträge

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.