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.