Relationen
Generische Relationen
Es gibt seit v5.0 die Möglichkeit Eltern-/Kind-Beziehungen abzubilden. Dazu wurde immer das (heutige) Entity RelationGeneric genutzt. Dieses Entity speichert alle Verknüpfungen in einer zentralen Datentabelle. Das birgt einen Performance-Nachteil, da relativ schnell mehrere millionen Datensätze mit sehr unterschiedlichem Kontext entstehen.
Beispiel
<?php
$repository
->getDbalHandler()
->getRelationManager(Entity\ParentClass::class, Entity\ChildClass::class)
->relate($parentID, [$childID])
;
Dedizierte Relationen
Relationen sind seit v5.6 dedizierte Entities die Eltern-/Kind-Beziehungen zwischen Datensätzen abbilden.
Sie müssen mit dem Tabellenprefix relation
versehen werden. Relation-Entities enthalten zwei Konstanten,
die dazu dienen die beiden relevanten Tabellen zu verbinden. Zu beachten:
Ableitung von Doctrine\Definition\DedicatedRelationAbstract
repositoryClass = Brandbox\Framework\Brandbox\Doctrine\Lib\Repository\DedicatedRelationRepository
Beispiel
<?php
namespace Brandbox\YourApp\YourPackageNamespace\YourPackageName\Lib\Entity {
use Brandbox\Framework\Brandbox\Doctrine;
/**
* @Entity(repositoryClass="Brandbox\Framework\Brandbox\Doctrine\Lib\Repository\DedicatedRelationRepository")
* @Table(name="relation_me_you")
*
**/
class RelationMeYou extends Doctrine\Definition\DedicatedRelationAbstract
{
protected const PARENT_REPOSITORY = ParentEntityClass::class;
protected const CHILD_REPOSITORY = ChildEntityClass::class;
}
}
Sobald die Tabelle durch die Installationsroutine bereit gestellt wurde, ist es möglich mit dem RelationManager auf die Relationen zuzugreifen.
Beispiel: Kinder lesen
$this // oder Application\Application::get()
->getDbalHandler()
->getRelationManager(Entity\RelationMeYou::class)
->getChildren(123)
;
Beispiel: Eltern lesen
Weitere Methoden sind dem Interface Dbal\Definition\RelationManagerInterface zu entnehmen.