Initial xentral_oss_20.3.c9ffacf

This commit is contained in:
Alex
2021-05-21 08:49:41 +02:00
parent 5406e4a551
commit 34e5ac43d9
18884 changed files with 2109867 additions and 0 deletions
@@ -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',
),
),
)
```
+51
View File
@@ -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)
```