# 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)
```