Initial xentral_oss_20.3.c9ffacf
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
# Data Manipulation
|
||||
|
||||
## `perform()`
|
||||
|
||||
Für alle SQL Anweisung außer `SELECT`. Die Methode gibt nichts zurück. Sollte die Ausführung
|
||||
fehlschlagen, so wird eine Exception geworfen.
|
||||
|
||||
```php
|
||||
$sql = 'UPDATE foo SET bar = :bar WHERE id = :id';
|
||||
|
||||
$values = [
|
||||
'bar' => 'baz',
|
||||
'id' => 123,
|
||||
];
|
||||
|
||||
$db->perform($sql, $values);
|
||||
```
|
||||
|
||||
## `fetchAffected()`
|
||||
|
||||
Für `INSERT`, `REPLACE`, `UPDATE` und `DELETE` Anweisungen. Gibt die Anzahl der betroffenen Datensätze zurück.
|
||||
|
||||
```php
|
||||
$sql = 'UPDATE foo SET bar = :bar WHERE 1';
|
||||
|
||||
$values = [
|
||||
'bar' => 'baz',
|
||||
];
|
||||
|
||||
echo $db->fetchAffected($sql, $values);
|
||||
```
|
||||
|
||||
###### Ausgabe
|
||||
|
||||
```
|
||||
42
|
||||
```
|
||||
|
||||
## `lastInsertId()`
|
||||
|
||||
Gibt den zuletzt erzeugten Auto-Increment-Wert zurück.
|
||||
|
||||
```php
|
||||
$sql = 'INSERT INTO foo (id, bar) VALUES (NULL, :bar)';
|
||||
|
||||
$values = [
|
||||
'bar' => 'baz',
|
||||
];
|
||||
|
||||
$db->perform($sql, $values);
|
||||
// $db->fetchAffected($sql, $values); // Alternative
|
||||
|
||||
echo $db->lastInsertId();
|
||||
```
|
||||
|
||||
###### Ausgabe
|
||||
```
|
||||
123
|
||||
```
|
||||
|
||||
## Multiple-Row-Insert
|
||||
|
||||
```php
|
||||
$sql = 'INSERT INTO foo (id, bar) VALUES (NULL, :bar1, :baz1), (NULL, :bar2, :baz2), (NULL, :bar3, :baz3)';
|
||||
|
||||
$values = [
|
||||
'bar1' => 'bar',
|
||||
'baz1' => 'baz',
|
||||
'bar2' => 'barbar',
|
||||
'baz2' => 'bazbaz',
|
||||
'bar3' => 'barbarbar',
|
||||
'baz3' => 'bazbazbaz',
|
||||
];
|
||||
|
||||
$db->perform($sql, $values);
|
||||
// $db->fetchAffected($sql, $values); // Alternative; Rückgabe wäre `3`
|
||||
```
|
||||
@@ -0,0 +1,158 @@
|
||||
|
||||
# Datensätze abrufen
|
||||
|
||||
## `fetchAll()`
|
||||
|
||||
```php
|
||||
$data = $db->fetchAll('SELECT a.id, a.typ, a.name_de FROM artikel AS a WHERE a.id > 5');
|
||||
```
|
||||
```
|
||||
array (
|
||||
0 =>
|
||||
array (
|
||||
'id' => 6,
|
||||
'typ' => 'produkt',
|
||||
'name_de' => 'LED Anzeige RLED 24-8',
|
||||
),
|
||||
1 =>
|
||||
array (
|
||||
'id' => 7,
|
||||
'typ' => 'produkt',
|
||||
'name_de' => 'Schalter S3 24V 5A',
|
||||
),
|
||||
...
|
||||
)
|
||||
```
|
||||
|
||||
## `fetchAssoc()`
|
||||
|
||||
Wie `fetchAll()` allerdings wird das Ergebnis der ersten Spalte als Index verwendet.
|
||||
|
||||
```php
|
||||
$data = $db->fetchAssoc('SELECT a.id, a.typ, a.name_de FROM artikel AS a WHERE a.id > 5');
|
||||
```
|
||||
```
|
||||
array (
|
||||
6 =>
|
||||
array (
|
||||
'id' => 6,
|
||||
'typ' => 'produkt',
|
||||
'name_de' => 'LED Anzeige RLED 24-8',
|
||||
),
|
||||
7 =>
|
||||
array (
|
||||
'id' => 7,
|
||||
'typ' => 'produkt',
|
||||
'name_de' => 'Schalter S3 24V 5A',
|
||||
),
|
||||
...
|
||||
)
|
||||
```
|
||||
|
||||
## `fetchRow()`
|
||||
|
||||
Liefert die Ergebnisse der ersten Zeile als assoziatives Array. Die Spaltennamen werden als Index verwendet.
|
||||
|
||||
```php
|
||||
$data = $db->fetchRow('SELECT a.id, a.name_de, a.name_en, a.logdatei FROM artikel AS a WHERE a.id > 5');
|
||||
```
|
||||
```
|
||||
array (
|
||||
'id' => 6,
|
||||
'name_de' => 'LED Anzeige RLED 24-8',
|
||||
'name_en' => '',
|
||||
'logdatei' => '2015-10-26 17:26:27',
|
||||
)
|
||||
```
|
||||
|
||||
## `fetchValue()`
|
||||
|
||||
Liefert nur das Ergebnis der ersten Zeile und Spalte zurück.
|
||||
|
||||
```php
|
||||
$data = $db->fetchValue('SELECT a.name_de, name_en, a.logdatei FROM artikel AS a WHERE a.id > 5');
|
||||
```
|
||||
```
|
||||
'LED Anzeige RLED 24-8'
|
||||
```
|
||||
|
||||
## `fetchCol()`
|
||||
|
||||
Liefert nur die Ergebnisse der ersten Spalte zurück.
|
||||
|
||||
```php
|
||||
$data = $db->fetchCol('SELECT a.name_de, a.name_en, a.logdatei FROM artikel AS a WHERE a.id > 5');
|
||||
```
|
||||
```
|
||||
array (
|
||||
0 => 'LED Anzeige RLED 24-8',
|
||||
1 => 'Schalter S3 24V 5A',
|
||||
2 => 'Gehäuse GHK5 20x30x10',
|
||||
...
|
||||
)
|
||||
```
|
||||
|
||||
## `fetchPairs()`
|
||||
|
||||
Gibt ein (eindimentionales) assoziatives Array zurück. Der Wert der ersten Spalte wird als Index verwendet und die zweite Spalte als Wert.
|
||||
**Erwartet werden genau zwei Spalten, andernfalls wird eine Exception geworfen.**
|
||||
|
||||
```php
|
||||
$data = $db->fetchPairs('SELECT a.nummer, a.name_de FROM artikel AS a WHERE a.id > 5');
|
||||
```
|
||||
```
|
||||
array (
|
||||
700006 => 'LED Anzeige RLED 24-8',
|
||||
700007 => 'Schalter S3 24V 5A',
|
||||
700008 => 'Gehäuse GHK5 20x30x10',
|
||||
...
|
||||
)
|
||||
```
|
||||
|
||||
## `fetchGroup()`
|
||||
|
||||
Verhält sich wie `fetchAssoc()`; mit der Ausnahme dass die Werte der ersten Spalte gruppiert werden.
|
||||
|
||||
```php
|
||||
$data = $db->fetchGroup(
|
||||
'SELECT a.typ, a.nummer, a.name_de, a.logdatei FROM artikel AS a WHERE a.id > 5'
|
||||
);
|
||||
```
|
||||
```
|
||||
array (
|
||||
'produkt' =>
|
||||
array (
|
||||
0 =>
|
||||
array (
|
||||
'typ' => 'produkt',
|
||||
'nummer' => '700006',
|
||||
'name_de' => 'LED Anzeige RLED 24-8',
|
||||
'logdatei' => '2015-10-26 17:26:27',
|
||||
),
|
||||
1 =>
|
||||
array (
|
||||
'typ' => 'produkt',
|
||||
'nummer' => '700007',
|
||||
'name_de' => 'Schalter S3 24V 5A',
|
||||
'logdatei' => '2015-10-26 17:26:59',
|
||||
),
|
||||
2 =>
|
||||
array (
|
||||
'typ' => 'produkt',
|
||||
'nummer' => '700008',
|
||||
'name_de' => 'Gehäuse GHK5 20x30x10',
|
||||
'logdatei' => '2018-05-23 05:18:52',
|
||||
),
|
||||
),
|
||||
'gebuehr' =>
|
||||
array (
|
||||
0 =>
|
||||
array (
|
||||
'typ' => 'gebuehr',
|
||||
'nummer' => '100001',
|
||||
'name_de' => 'Versandkosten',
|
||||
'logdatei' => '2018-06-17 10:09:36',
|
||||
),
|
||||
),
|
||||
)
|
||||
```
|
||||
@@ -0,0 +1,51 @@
|
||||
# Database-Komponente
|
||||
|
||||
###### Verwendete Libraries
|
||||
|
||||
* **Aura.SqlQuery**:
|
||||
* Composer: `aura/sqlquery:2.7.*`
|
||||
* Packagist: https://packagist.org/packages/aura/sqlquery
|
||||
* GitHub: https://github.com/auraphp/Aura.SqlQuery
|
||||
* Docs: https://github.com/auraphp/Aura.SqlQuery/tree/2.x
|
||||
|
||||
* **~~Aura.Sql~~** Wird in 19.4 entfernt
|
||||
* Composer: `aura/sql:3.*`
|
||||
* Packagist: https://packagist.org/packages/aura/sql
|
||||
* GitHub: https://github.com/auraphp/Aura.Sql
|
||||
* Docs: https://github.com/auraphp/Aura.Sql/blob/3.x/docs/index.md
|
||||
|
||||
##### Database-Komponente aus Container holen
|
||||
|
||||
```php
|
||||
$db = $container->get('Database');
|
||||
```
|
||||
|
||||
Im alten Bereich:
|
||||
|
||||
```php
|
||||
$db = $this->app->Container->get('Database');
|
||||
```
|
||||
|
||||
## Themen
|
||||
|
||||
* [Datensätze abrufen (fetch)](fetch_results.md)
|
||||
* [Datensätze abrufen mit Generatoren (yield)](yield_results.md)
|
||||
* [Datensätze ändern](data_manipulation.md)
|
||||
* [Transaktionen](transactions.md)
|
||||
* [Named Parameter / Prepared Statements](named_parameter.md)
|
||||
* [SQL Query Builder](query_builder.md)
|
||||
|
||||
## Exceptions
|
||||
|
||||
Die Database-Komponente verwendet intern `mysqli`. Im Unterschied zu `mysqli` werden in Fehlerfällen aber
|
||||
Exceptions geworfen; z.B.:
|
||||
|
||||
* Wenn die Verbindung zur Datenbank fehlschlägt => `ConnectionException`
|
||||
* Wenn ein SQL-Statement fehlerhaft ist oder aus anderen Gründen nicht erfolgreich ausgeführt
|
||||
werden kann => `QueryFailureException`
|
||||
* Wenn `Named Parameter` fehlen => `MissingParameterException`
|
||||
|
||||
##### ExceptionInterface
|
||||
|
||||
Alle Exceptions die von der Database-Komponente geworfen werden implementieren das
|
||||
`\Xentral\Components\Database\Exception\DatabaseExceptionInterface` Interface.
|
||||
@@ -0,0 +1,44 @@
|
||||
# Named Parameter
|
||||
|
||||
`perform()`, `fetch*()` und `yield*()`-Methoden nehmen als zweiten Parameter ein assoziatives Array entgegen.
|
||||
Mit diesem Array werden lassen sich Werte als *Named Parameter* 'binden'.
|
||||
|
||||
```php
|
||||
$sql =
|
||||
'SELECT a.id, a.nummer, a.name_de
|
||||
FROM artikel AS a
|
||||
WHERE a.typ IN (:types)
|
||||
AND a.nummer LIKE :nummers
|
||||
LIMIT :start, :length';
|
||||
|
||||
$values = [
|
||||
'types' => ['produkt', 'gebuehr'],
|
||||
'nummers' => '7000%',
|
||||
'start' => 0,
|
||||
'length' => 3,
|
||||
];
|
||||
|
||||
$data = $db->fetchAll($sql, $values);
|
||||
```
|
||||
```
|
||||
array (
|
||||
0 =>
|
||||
array (
|
||||
'id' => 1,
|
||||
'nummer' => '700001',
|
||||
'name_de' => 'Schraube M10x20',
|
||||
),
|
||||
1 =>
|
||||
array (
|
||||
'id' => 2,
|
||||
'nummer' => '700002',
|
||||
'name_de' => 'Sechskant-Mutter M10',
|
||||
),
|
||||
2 =>
|
||||
array (
|
||||
'id' => 3,
|
||||
'nummer' => '700003',
|
||||
'name_de' => 'Schalthebel 20x10',
|
||||
),
|
||||
)
|
||||
```
|
||||
@@ -0,0 +1,13 @@
|
||||
# Profiler
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
/** @var \Xentral\Components\Database\Profiler\Profiler $profiler */
|
||||
$profiler = $container->get('DatabaseProfiler');
|
||||
$profiler->setActive(true);
|
||||
|
||||
$database->fetchAll($sql);
|
||||
|
||||
var_dump($profiler->getContexts());
|
||||
```
|
||||
@@ -0,0 +1,97 @@
|
||||
# SQL Query Builder
|
||||
|
||||
###### Verwendete Libraries
|
||||
|
||||
* **Aura.SqlQuery**:
|
||||
* Composer: `aura/sqlquery:2.7.*`
|
||||
* Packagist: https://packagist.org/packages/aura/sqlquery
|
||||
* GitHub: https://github.com/auraphp/Aura.SqlQuery
|
||||
* Docs: https://github.com/auraphp/Aura.SqlQuery/tree/2.x
|
||||
|
||||
## Query Builder erzeugen
|
||||
|
||||
```php
|
||||
$select = $db->select();
|
||||
$update = $db->update();
|
||||
$insert = $db->insert();
|
||||
$delete = $db->delete();
|
||||
```
|
||||
|
||||
## SELECT-Query
|
||||
|
||||
https://github.com/auraphp/Aura.SqlQuery/tree/2.x#select
|
||||
|
||||
###### Beispiel mit Named-Placeholder
|
||||
|
||||
```php
|
||||
$select = $db->select();
|
||||
$select
|
||||
->cols(['u.id', 'u.description'])
|
||||
->from('user AS u')
|
||||
->where('u.id = :user_id')
|
||||
->bindValue('user_id', 1);
|
||||
|
||||
$result = $db->fetchAll(
|
||||
$select->getStatement(),
|
||||
$select->getBindValues()
|
||||
);
|
||||
|
||||
var_export($result);
|
||||
// array(
|
||||
// 0 => array(
|
||||
// 'id' => 1,
|
||||
// 'description' => 'Administrator',
|
||||
// ),
|
||||
// )
|
||||
```
|
||||
|
||||
###### Alternative mit ?-Placeholder
|
||||
|
||||
```php
|
||||
$select = $db->select();
|
||||
$select
|
||||
->cols(['u.id', 'u.description'])
|
||||
->from('user AS u')
|
||||
->where('u.id = ?', 1);
|
||||
```
|
||||
|
||||
###### Beispiel mit Verschachtelung im WHERE
|
||||
|
||||
```php
|
||||
$select = $db->select();
|
||||
$select
|
||||
->cols(['u.id', 'u.description'])
|
||||
->from('user AS u')
|
||||
->where('u.activ = ?', 1)
|
||||
->where(function (SelectQuery $query) {
|
||||
$query->where('u.type = ?', 'admin')
|
||||
->orWhere('u.type = ?', 'standard');
|
||||
});
|
||||
|
||||
echo $select->getStatement();
|
||||
```
|
||||
```sql
|
||||
SELECT
|
||||
`u`.`id`,
|
||||
`u`.`description`
|
||||
FROM
|
||||
`user` AS `u`
|
||||
WHERE
|
||||
`u`.`activ` = :_1_1_
|
||||
AND (
|
||||
`u`.`type` = :_1_2_
|
||||
OR `u`.`type` = :_1_3_
|
||||
)
|
||||
```
|
||||
|
||||
## INSERT-Query
|
||||
|
||||
https://github.com/auraphp/Aura.SqlQuery/tree/2.x#insert
|
||||
|
||||
## UPDATE-Query
|
||||
|
||||
https://github.com/auraphp/Aura.SqlQuery/tree/2.x#update
|
||||
|
||||
## DELETE-Query
|
||||
|
||||
https://github.com/auraphp/Aura.SqlQuery/tree/2.x#delete
|
||||
@@ -0,0 +1,25 @@
|
||||
# Transaktionnen
|
||||
|
||||
## Transaktion starten
|
||||
|
||||
```php
|
||||
$db->beginTransaction();
|
||||
```
|
||||
|
||||
## Transaktion übernehmen / Commit
|
||||
|
||||
```php
|
||||
$db->commit();
|
||||
```
|
||||
|
||||
## Transaktion zurücknehmen / Rollback
|
||||
|
||||
```php
|
||||
$db->rollback();
|
||||
```
|
||||
|
||||
## Prüfen ob Transaktion gestartet ist
|
||||
|
||||
```php
|
||||
$db->inTransaction();
|
||||
```
|
||||
@@ -0,0 +1,107 @@
|
||||
|
||||
# Datensätze abrufen mit Generatoren
|
||||
|
||||
Um den Arbeitsspeicherverbrauch gering zu halten bieten sich zum Iterieren von großen Datenmengen
|
||||
Generatoren an: https://www.php.net/manual/de/language.generators.overview.php
|
||||
|
||||
Die Database-Komponente stellt für diesen Zweck `yield`-Methoden zur Verfügung.
|
||||
|
||||
|
||||
## `yieldAll()`
|
||||
|
||||
Wie `fetchAll()`; jede Zeile ist ein assoziatives Array.
|
||||
|
||||
```php
|
||||
$statement = 'SELECT a.id, a.typ, a.name_de FROM artikel AS a WHERE a.typ = :typ LIMIT 2';
|
||||
$bindValues = ['typ' => 'produkt'];
|
||||
|
||||
foreach ($db->yieldAll($statement, $bindValues) as $row) {
|
||||
var_dump($row);
|
||||
}
|
||||
```
|
||||
```
|
||||
array (size=3)
|
||||
'id' => int 2
|
||||
'typ' => string 'produkt' (length=7)
|
||||
'name_de' => string 'Sechskant-Mutter M10' (length=20)
|
||||
|
||||
array (size=3)
|
||||
'id' => int 3
|
||||
'typ' => string 'produkt' (length=7)
|
||||
'name_de' => string 'Schalthebel 20x10' (length=17)
|
||||
```
|
||||
|
||||
|
||||
## `yieldAssoc()`
|
||||
|
||||
Wie `fetchAssoc()`; jede Zeile ist ein assoziatives Array; der Key beinhaltet den Wert der ersten Spalte
|
||||
|
||||
```php
|
||||
$statement = 'SELECT a.id, a.typ, a.name_de FROM artikel AS a WHERE a.typ = :typ LIMIT 2';
|
||||
$bindValues = ['typ' => 'produkt'];
|
||||
|
||||
foreach ($db->yieldAssoc($statement, $bindValues) as $key => $row) {
|
||||
var_dump($key);
|
||||
var_dump($row);
|
||||
}
|
||||
```
|
||||
```
|
||||
int 2
|
||||
array (size=3)
|
||||
'id' => int 2
|
||||
'typ' => string 'produkt' (length=7)
|
||||
'name_de' => string 'Sechskant-Mutter M10' (length=20)
|
||||
|
||||
int 3
|
||||
array (size=3)
|
||||
'id' => int 3
|
||||
'typ' => string 'produkt' (length=7)
|
||||
'name_de' => string 'Schalthebel 20x10' (length=17)
|
||||
```
|
||||
|
||||
|
||||
## `yieldPairs()`
|
||||
|
||||
Wie `fetchPairs()`; jede Zeile besteht aus Key-Value-Paaren; der Key beinhaltet den Inhalt der ersten Spalte;
|
||||
der Wert den Inhalt der zweiten Spalte.
|
||||
|
||||
**Erwartet werden genau zwei Spalten, andernfalls wird eine Exception geworfen.**
|
||||
|
||||
```php
|
||||
$statement = 'SELECT a.id, a.name_de FROM artikel AS a WHERE a.typ = :typ LIMIT 2';
|
||||
$bindValues = ['typ' => 'produkt'];
|
||||
|
||||
foreach ($db->yieldPairs($statement, $bindValues) as $key => $value) {
|
||||
var_dump($key);
|
||||
var_dump($value);
|
||||
}
|
||||
```
|
||||
```
|
||||
int 2
|
||||
string 'Sechskant-Mutter M10' (length=20)
|
||||
|
||||
int 3
|
||||
string 'Schalthebel 20x10' (length=17)
|
||||
```
|
||||
|
||||
|
||||
## `yieldCol()`
|
||||
|
||||
Wie `fetchCol()`; jede Zeile beinhaltet nur den Wert der ersten Spalte.
|
||||
|
||||
```php
|
||||
$statement = 'SELECT a.name_de FROM artikel AS a WHERE a.typ = :typ LIMIT 2';
|
||||
$bindValues = ['typ' => 'produkt'];
|
||||
|
||||
foreach ($db->yieldCol($statement, $bindValues) as $key => $value) {
|
||||
var_dump($key);
|
||||
var_dump($value);
|
||||
}
|
||||
```
|
||||
```
|
||||
int 0
|
||||
string 'Sechskant-Mutter M10' (length=20)
|
||||
|
||||
int 1
|
||||
string 'Schalthebel 20x10' (length=17)
|
||||
```
|
||||
Reference in New Issue
Block a user