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.
Codeblock |
---|
language | php |
---|
theme | RDark |
---|
title | 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
Codeblock |
---|
language | php |
---|
theme | RDark |
---|
title | 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.
Codeblock |
---|
language | php |
---|
theme | RDark |
---|
title | Beispiel: Kinder lesen |
---|
|
$this // oder Application\Application::get()
->getDbalHandler()
->getRelationManager(Entity\RelationMeYou::class)
->getChildren(123)
; |
Codeblock |
---|
language | php |
---|
theme | RDark |
---|
title | 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.