-
-
Notifications
You must be signed in to change notification settings - Fork 3
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
YOrm Query-Builder berücksichtigen #382
Comments
Beispiele, wo ich den QueryBuilder statt SQL bzw. rex_sql nutze: EP YFORM_DATA_LIST_QUERY: Seit YForm 4 wird die Datensatzliste als YForm-Query erstellt. Das macht es deutlich einfacher, die Query (früher SQL-Statement) anzupassen. Typische Anpassungen sind ... SortierungYForm-Standardist ein Feld; zwei/drei können durch Yorm-Anpassung aktiviert werden. Beispiel hier im Geolocation-Addon Zusätzliche Felder für die ListeDie Liste wird im EP YFORM_DATA_LIST angepasst. Will man zusätzliche Spalten mit (aggregierten) Informationen aus anderen Tabellen haben, setzen viele ein CustomFormat (=Callback) auf die Spalte, rufen im Callback die Daten ab und verarbeiten sie. Das bedeutet zusätzliche zur Haupt-Query n weitere SQL-Abfrage. Überflüssig, wenn man die Hauptquery geschickt ergänzt hat. Daten aus be_manager_relation verlinkten Datensätze aufbereiten / aggregierenAus Sicht einer "Dokumenten"-Tabelle; Der Join geht auf eine "Historie"-Tabelle, die die im Dokument erwähnten Boote enthält. In der Tabellenzeile wird das Feld rex_extension::register(
'YFORM_DATA_LIST_QUERY',
static function (rex_extension_point $ep)
{
$query = $ep->getSubject();
$alias = $query->getTableAlias();
// Join auf die Boote/Historie und daraus die Anzahl Boote ermitteln
$query->selectRaw('COUNT(DISTINCT a.id)', 'anzahl_boote');
$query->joinRelation('do_id_historie','a');
// Sortieren nach Dokumententyp und Datum
$query->orderBy($alias.'.do_id_doktyp');
$query->orderBy($alias.'.do_datum');
// Wegen der Joins mit Aggregat-Funktion: Gruppieren nach id des Hauptsatzes
$query->groupBy($alias.'.id');
} Delete nur wenn zulässig (eingehende Referenzen prüfen)Aus Sicht einer "Scan"-Tabelle. Scans sind in Dokumenten als Nachweis verlinkt (SET, kommaseparierte ID-Liste). rex_extension::register(
'YFORM_DATA_LIST_QUERY',
static function (rex_extension_point $ep)
{
$query = $ep->getSubject();
$alias = $query->getTableAlias();
// Join auf die Dokumente und ermitteln, ob der Scan irgendwo verlinkt ist
$query->selectRaw('(0 < COUNT(a.id) )', 'im_dokument');
$query->joinRaw('LEFT', 'rex_kv30_dokument', 'a', 'FIND_IN_SET('.$alias.'.id, a.do_id_scan)');
// Wegen der Joins mit Aggregat-Funktion: Gruppieren nach id des Hauptsatzes
$query->groupBy($alias.'.id');
} |
Wie gewünscht ein paar Infos zum Query-Builder von YOrm (YForm).
Der Query-Builder ist komplett in dieser Klasse abgebildet: https://github.com/yakamara/redaxo_yform/blob/master/plugins/manager/lib/yform/manager/query.php
Ein Beispiel:
Einstieg
Es gibt diese Wege, um das Query-Objekt zu erzeugen:
$table
ist also jeweils ein Tabellenname. (Wobei nur Tabellen zugelassen sind, die vom YForm Table Manager verwaltet werden)Fluent API
Hier gibt es recht viele Methoden. Die meisten haben eine Variante mit Escaping und eine Raw-Variante, z.B.
where()
undwhereRaw
.Am besten mal die Klasse selbst durchschauen, welche Methoden da alle existieren.
Hier ein paar Infos zu den verwendeten Parametern in den Methoden, die sich anhand des Namens gruppieren lassen:
$table
$column
,$column1
,$column2
,$keyColumn
Aber es gibt hier ein Sonderhandling, es ist auch
table.column
oderalias.column
erlaubt. Dazu gibt es eine abgewandeltequoteIdentifier
-Methode in der Klasse.Teils kann es auch ein Alias sein, z.B.
->select('COUNT(1)', 'count')->orderBy('count')
, da wird an$column
in orderBy also ein vorher gesetzer Alias übergebenBei
joinRelation
/leftJoinRelation
/joinTypeRelation
kann es auch ein virtueller Name sein für eine in YForm hinterlegte Relation$alias
$operator
'AND'
oder'OR'
erwartet (dort als Type auch definiert). Wird aber nicht geprüft, kommt letztlich also raw in die Query rein).Bei anderen Methoden (z.B.
where()
) ist es ein beliebiger SQL-Operator (=
,LIKE
,NOT IN
etc.). Landet auch raw in der Query.$type
'INNER'
etc.). Aktuell auch ohne Validierung und landet raw in der Query.$expression
,$where
,$condition
$value
,$from
,$to
$nested
whereNested()
. Wenn es ein Array ist, dann sind die Keys Column-Namen, nach der gleichen Logik wie oben bei$column
erläutert. Auch verschachtelte Arrays möglich. Werte wie bei$value
.Abschluss
Dann gibt es noch diverse Abschluss-Methoden, also um die Query auszuführen und ein Ergebnis zu bekommen:
Alle
find*
-Methoden,getIterator
,paginate
,count
,exists
Kannst du damit so was anfangen? Ansonsten gerne weiter fragen, z.B. wenn ich zu bestimmten Methoden noch Beispiele liefern soll oder so.
The text was updated successfully, but these errors were encountered: