MySQL REGEXP mit Propel umsetzen, so gehts

Hier einmal kurz zusammengefasst, wie man das Thema REGEXP in Propel ganz einfach umsetzen kann.

Ich bleibe wieder beim Propel Beispiel des Buchladens. Nehmen wir einmal an, dass wir „ungültige“ ISBN ermitteln wollen und mal vom einfachen Fall ausgehen, dass diese dann auch erst gar keine Zahlen enthalten. Wir wollen also alle Ergebnisse gelistet bekommen, wo die ISBN gar keine Zahl enthält.

Über reines SQL würde das so aussehen:

SELECT
    *
FROM
    book
WHERE
    isbn NOT REGEXP [[:digit:]]

Über Propel ist diese SQL ganz einfach zu realisieren:

$booksWithoutIsbn = BookQuery::create()
    ->filterByISBN("[[:digit:]]", " NOT REGEXP ")
    ->find()
;

Das ist eigentlich auch schon alles. Bitte auf die Leerzeichen vor und nach dem " NOT REGEXP " achten, sonst wird daraus ein MySQL Syntaxfehler.

Leider gibt Propel keine Konstanten Criteria::REGEXP und Criteria::NOT_REGEXP her, daher ist die eben genannte Variante am Einfachsten umzusetzen.

Weitere Infos zu regulären Ausdrücken (regular expressions = regexp) in MySQL findet Ihre auf der MySQL Reference Manual.


Natürlich könnte man die Abfrage auch mit Criteria::CUSTOM umsetzen, jedoch muss man in diesem Fall selbst beim Aufruf der filterByISBN() Methode trotzdem den Spaltennamen in der Bedingung mit angeben, da Criteria::CUSTOM von einer komplett „freien“ Anweisung ausgeht, in der man dann auch die Spalten ggf. noch „manipulieren“ kann.

Die von mir nicht zu empfehlende Variante mit Criteria::CUSTOM sieht dann so aus:

$booksWithoutIsbn = BookQuery::create()
    ->filterByISBN(BookTableMap::COL_ISBN . " NOT REGEXP '[[:digit:]]'", Criteria::CUSTOM)
    ->find()
;

In diesem Beispiel kommt hinzu, dass eventuell verwendete Tabellen Aliase nicht sauber benutzt werden. Wer trotzdem unbedingt mit Criteria::CUSTOM arbeiten will – eventuell sogar in diesem Fall als Erweiterungen der Base\BookQuery Klasse – sollte sich auch einmal die Methode getAliasedColName() anschauen.

Das könnte dich auch interessieren …

Schreibe einen Kommentar

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

Bitte beachte die Hinweise zum Datenschutz