Verwenden eines Iterators in Verbindung mit DTOs
Verständnis von Data Transfer Objects (DTOs) und Entitäten
Data Transfer Objects (DTOs) und Entitäten sind wesentliche Konzepte in der Softwareentwicklung, insbesondere in Szenarien, in denen Daten zwischen Diensten ausgetauscht werden, wie Webdiensten und APIs. Dieses Dokument zielt darauf ab, ein klares Verständnis von DTOs und Entitäten zu vermitteln, wobei ihre Unterschiede, Anwendungsfälle und ihre Bedeutung im Datenübertragungsprozess hervorgehoben werden.
Data Transfer Object (DTO)
DTO steht für Data Transfer Object. Es dient als strukturierter Container zur Übertragung von Daten zwischen verschiedenen Softwarekomponenten oder Diensten und erleichtert die Kommunikation.
DTOs werden hauptsächlich in Szenarien eingesetzt, in denen Daten zwischen Diensten, wie Webdiensten und APIs, ausgetauscht werden müssen.
Sie sind besonders nützlich, wenn die zu übertragenden Daten eine Kombination von Eigenschaften aus verschiedenen Entitäten umfassen, mit oder ohne zugehörige IDs.
Entitäten
Im Gegensatz dazu sind Entitäten eine Ansammlung von Eigenschaften, die dazu dienen, eine einzelne Entität mit einer spezifischen ID darzustellen (z. B. Lehrer, Schüler, Mitarbeiter usw.).
DTOs sind eine Ansammlung von bedeutungslosen Eigenschaften, die zum Versenden an den Client gesammelt werden, und ein DTO muss nicht zwangsläufig Beziehungen zu anderen DTOs haben. Entitäten hingegen umfassen Eigenschaften eines spezifischen Objekts mit bedeutsamen Beziehungen zu anderen Entitäten.
In einem relationalen Datenbankparadigma können DTOs als Zeile in einer Ansicht (View) betrachtet werden, während Entitäten Zeilen in Tabellen sind und eine Primärschlüsselbeziehung aufweisen.
Nutzen
Ein DTO kann dazu genutzt werden, nur einen Teil der Properties von MySQL zu erhalten. Das sorgt für kleinere Queries und weniger Daten.
Verwendung von DTOs mit einem Iterator
Das DTO soll im Package-Ordner /Lib/Dto/ liegen. Folgend ein Beispiel, um aus der Tabelle Administrator nur den Namen des Administrators zu lesen und verarbeiten.
namespace Brandbox\Framework\Abc\Def\Lib\Dto {
use Doctrine\ORM\Mapping\Column;
use Doctrine\ORM\Mapping\Entity;
use Doctrine\ORM\Mapping\Id;
#[Entity]
class SlimAdministrator extends DtoAbstract
{
#[Column(name: 'firstname', type: 'string')]
public string $firstname;
#[Id]
#[Column(name: 'id', type: 'integer')]
public int $id;
#[Column(name: 'lastname', type: 'string')]
public string $lastname;
}
}
Im Folgenden Code-Beispiel wird gezeigt, wie es möglich ist den QueryBuilder zu nutzen und eine Iterable zu erstellen. Doctrine erstellt einen Query, der nur die Attribute des DTO enthält.
$collationId = Brandbox\DefaultCollation::ROOT;
$where = [];
$orderBy = [];
/* @var Doctrine\Lib\Repository\RsmQueryBuilder $qb */
$qb = $this
->getDbalHandler()
->getEntityFinder()
->repositoryByClass(Administrator\Lib\Entity\Administrator::class)
->findMappedContentBy(Doctrine\Lib\Dto\SlimAdministrator::class)
;
$iterable = $qb
->addListWhere($where, $collationId)
->addListOrderBy($orderBy, $collationId)
->joinTranslation($collationId)
->setFirstResult(0)
->setMaxResults(2)
->getQuery()
->toIterable()
;
/* @var Doctrine\Lib\Dto\SlimAdministrator $record */
foreach ($iterable as $record) {
$record->decrypt(Administrator\Lib\Entity\Administrator::class);
// $record verwenden
}