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.