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
$this // oder Application\Application::get() ->getDbalHandler() ->getRelationManager(Entity\RelationMeYou::class) ->getChildren(123) ;
Weitere Methoden sind dem Interface Dbal\Definition\RelationManagerInterface zu entnehmen.