MySQL Datenbanken in ZF2 (ZendFramework 2)

Tag auch und hallo zu einem weiteren Kapitel im Allbytes Azubiblog!

Diese Woche ergaben sich ein paar Probleme im Bereich Umsetzung von SQL-Anweisungen in Zend Framework 2. Bei den benötigten SQL-Anweisungen handelte es sich um für meine Verhältnisse noch recht fortgeschrittene SQL-Statements und die zusätliche Umsetzung des Ganzen in ZF2 macht es nicht leichter. Neben JOIN (Verknüpfung über mehrere Tabellen hinweg) und GROUP BY (Gruppierung von Daten) musste ebenfalls die zuletzt abgespeicherte ID verwendet werden.

In PDO konnte man sich den zuletzt angelegten Primärschlüssel über die Methode „lastInsertValue()“ holen, allerdings funktionierte dies in ZF2 nicht ganz wie geplant.

In Zend Framework 2 wird der zuletzt generierte Primärschlüssel direkt bei der Datenbankverbindung (TableGateway) abgespeichert, das heißt, nachdem der Datenbankeintrag erstellt wurde, kann man über die Funktion „getLastInsertValue()“ auf die zuletzt erstellte ID zugreifen.

$this->tableGateway->getLastInsertValue();

Auch die Verwendung von JOINS oder in der WHERE-Klause befindlichen ANDs und ORs war anders als vermutet.

Für das SQL-Statement:

SELECT tabelle2.name FROM tabelle1 LEFT JOIN tabelle2 ON tabelle1.tabelle2_id tabelle2.id WHERE tabelle1.id=1;

Equivalenter ZF2 Code:

$select = new Zend\Db\Sql\Select();
$select->from('tabelle1');
$select->join('tabelle2', 'tabelle1.tabelle2_id = tabelle2.id', array('name'));
$select->where(array('tabelle1.id' => 1));
$resultSet = $this->tableGateway->selectWith($select);

Für das SQL-Statement:

SELECT * FROM tabelle1 WHERE id=? AND creation_date > ? AND creation_date < ?;

Equivalenter ZF2 Code:

$sqlObject&amp;nbsp;= new Sql($adapter);
$where = new Zend\Db\Sql\Where();
$where->equalTo('id', $id)
->and
->greaterThan('creation_date', $start_date)
->and
->lessThan('creation_date', $end_date);
$select = $sqlObject->select()->columns(['*'])->from('tabelle1')->where($where);
$statement = $sqlObject->prepareStatementForSqlObject($select);
$resultSet = new ResultSet();
$resultSet->initialize($results);

Zum Schluss hab ich glücklicherweise doch noch alles zum Laufen gebracht.

Grüße

Stefan