MB: funktionalität in Konstruktoren ähnlicher Klassen besser machen???

Beitrag lesen

moin,

hast Du den Code kopiert oder abgetippt? Denn bei BETWEEN in der non-safe Variante sind min und max vertauscht.

Ups danke!

Und vor allem fehlt hier der Kontextwechsel, diese Werte müssen escaped werden.

Welher Kontext Wechsel? Was muss escapet werden?

Dein toString kann das nicht machen, weil dann die toString Aufrufe im safe-Teil falsch wären. […]

ich hab kein __toString()-Methode. Ich sammel alles und dann concatenate ich. Ein konkretes Dummy Beispiel.

$subQuery = new QueryBuilder( new InitDBContextPOPO ( $schema, [
    'tableA'    => 'tA',
    'tableB'    => 'tB',
    'tableC'    => 'tC'
] ) );

$subQuery
  ->generalSelect ( $allColumns )
  ->generalFunction ( $cases )
  ->source ( $equiJoin )
  ->generalCondition ( new LogicContainer ( [
    $between, $in
  ], LogicConstant::_OR ), LogicConstant::_NONE )
  ->generalOrder ( $sort );

/* Init Supra Query */

$supraQuery
  /* n Constructs */
  ->generalCondition (
    new Comparison (
      EquotationConstant::_EQUAL, 
      $everything,
      new SubQuery (
        $subQuery->getResult ( )
      )
    ), LogicConstant::_NONE )
  )
  /* n Constructs */
  
var_dump ( $supraQuery->getResult() );

Die wird dann implizit aufgerufen, wenn das Objekt wie ein String verwendet wird.

$this->formatSqlFragment($safe, "@1 BETWEEN @2 AND @3", $value, $minimum, $maximum)

Das wäre ne Idee 😀. Bedankt.

[…] Aber das könnte man dann an vielen Stellen nutzen und es würde viele manuelle Formatieraufrufe kapseln.

was meinst du mit Manuelle Formatierung?

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.

Ja das drohgt mir

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.

Wo und was nachlesen?

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.

es können auch Werte sein numerischer Art und keine Spaltenangaben, daher ExpressionInterface. Aber ich muss ja noch mal genauer nach hacken, was das Prädikat BETWEEN eigentlich für Parameter animmt und was nicht. Dann kann ich das Interface anpassen.

lgmb