Hallo MB,
hast Du den Code kopiert oder abgetippt? Denn bei BETWEEN in der non-safe Variante sind min und max vertauscht. Und vor allem fehlt hier der Kontextwechsel, diese Werte müssen escaped werden. Dein toString kann das nicht machen, weil dann die toString Aufrufe im safe-Teil falsch wären.
Du könntest ggf. die häufigen toString Aufrufe dadurch ersetzen, dass Du den entsprechenden Objekten eine magic method __toString verpasst. Die wird dann implizit aufgerufen, wenn das Objekt wie ein String verwendet wird.
$this->formatSqlFragment($safe, "@1 BETWEEN @2 AND @3", $value, $minimum, $maximum)
So ein Aufruf müsste dann die @x Marker durch Parameter ersetzen, entsprechend schauen, ob das ein ColumnInterface oder ein ExpressionInterface ist und dann je nach Stand von $safe unterschiedlich generieren. Ob's dadurch klarer wird oder wirrer, weiß ich nicht recht 😉. Aber das könnte man dann an vielen Stellen nutzen und es würde viele manuelle Formatieraufrufe kapseln.
Es darf nur nicht zu viel werden. Irgendwann soll's ja auch mal ein Ergebnis bringen und die Datenbank befragen, und dafür darf nicht eine Sekunde mit abstraktem Hantieren vergehen.
Ich glaube, man kann auch sowas schreiben: WHERE 17 BETWEEN col1 AND col2
oder WHERE col2 BETWEEN 1 AND col3
- probier's mal aus und lies es nach. Das könnte Dir deinen BETWEEN-Builder ordentlich verhageln, weil nämlich dann jede der 3 Positionen wahlweise eine Spaltenangabe oder eine Expression sein kann.
Rolf
sumpsi - posui - clusi