FriendsOfREDAXO / FriendsOfREDAXO/rexstan

YOrm Query-Builder berücksichtigen

Open
#382 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
PHP
Stars
41
Forks
3
Avg merge
1d 3h
Merged PRs (30d)
7

Description

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:

```php
$datasets = rex_yform_manager_query::get('my_table')
->where('col1', 'foo') // =
->where('col2', [1, 2, 3]) // IN
->where('col3', 5, '>')
->whereRaw('col4 = :col4 OR col4 IS NULL', ['col4' => $col4])
->joinRelation('other_id', 'o') // die in yform hinterlegte Relation auf dem other_id Feld wird verknüpft mit Alias o
->select('o.foo') // zusätzliches Feld aus der Relation abfragen
->orderBy('o.name')
->orderByRaw('IF(col1 = 1, col2, col3)')
->find();
```

### Einstieg

Es gibt diese Wege, um das Query-Objekt zu erzeugen:
```php
rex_yform_manager_query::get($table);
rex_yform_manager_table::get($table)->query();
rex_yform_manager_dataset::query($table);

// MyModel extends rex_yform_manager_dataset
// hier kann der $table param weggelassen werden
// Es wurde dann irgendwo `rex_yform_manager_dataset::setModelClass($table, MyModel::class)` aufgerufen
MyModel::query();

// Hier wird an einem Dataset zu einer in yform hinterlegten Relation ein Query-Objekt erzeugt
// hier wird es für rexstan schwer, zu wissen, welche Table dahinter steckt
$dataset->getRelatedQuery($key);
```

`$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()` und `whereRaw`.
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:

Param | Hinweis
--- | ---
`$table` | Tabellenname, wird escaped mit Backsticks
`$column`, `$column1`, `$column2`, `$keyColumn` | Spaltenname, wird escaped mit Backsticks.

Aber es gibt hier ein Sonderhandling, es ist auch `table.column` oder `alias.column` erlaubt. Dazu gibt es eine abgewandelte `quoteIdentifier`-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 übergeben

Bei `joinRelation`/`leftJoinRelation`/`joinTypeRelation` kann es auch ein virtueller Name sein für eine in YForm hinterlegte Relation
`$alias` | Alias-Name für Tabelle oder Spalte. Werden neuerdings auch escaped.
`$operator` | Bei manchen Methoden wird `'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` | Bei den Join-Methoden der Join-Type (`'INNER'` etc.). Aktuell auch ohne Validierung und landet raw in der Query.
`$expression`, `$where`, `$condition` | Raw SQL-Schnipsel
`$value`, `$from`, `$to` | Werte, die escaped werden (per prepared Query-Params)
`$nested` | Parameter bei `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.

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.