Skip to content

LinkedTo (m:n)

todo

Modellierung

Eine m:n-Beziehung wird im ORM durch drei Bestandteile modelliert.

  • In Model A eine LinkedTo-Beziehung auf Model B.
  • In Model B eine LinkedTo-Beziehung auf Model A.
  • Ein Link-Model mit ForeignKeys auf Models A und B.

Das Link-Model wird standardmäßig vom ORM zur Laufzeit generiert, muss also nicht im Code deklariert werden. Falls zusätzliche Spalten benötigt werden, kann aber auch ein eigenes Model als Link-Model verwendet werden.

Deklaration

Eine LinkedTo-Beziehung wird mit der Methode linkedTo der Klasse Table erstellt.

php
linkedTo(string $name, string $target, string $link = null, string $fk1 = null, string $fk2 = null): LinkedTo
  • Der Parameter $name definiert den Namen der Eigenschaft, mit der auf die Beziehung zugegriffen wird.
  • Der Parameter $target erwartet den Klassennamen des referenzierten Models (A oder B).
  • Der Parameter $link spezifiert den Klassennamen des Link-Models. Standardmäßig generiert der ORM zur Laufzeit ein Link-Model, wobei der Name aus dem Präfix Link und den Models A und B in alphabetischer Reihenfolge gebildet wird.
  • Der Parameter $fk1 spezifiert die Fremdschlüsselspalte des Link-Models auf Model A. Standardmäßig wird der Tabellenname von Model A mit dem Suffix _id verwendet.
  • Der Parameter $fk2 spezifiert die Fremdschlüsselspalte des Link-Models auf Model B. Standardmäßig wird der Tabellenname von Model B mit dem Suffix _id verwendet.

Beispiel 1

Folgendes Beispiel zeigt eine m:n-Beziehung zwischen den Models Product und Keyword. Jedes Produkt kann also beliebig viele Keywords haben (0..*) und jedes Keyword kann beliebig vielen Produkten zugeordnet sein (0..*).

Das Link-Model LinkKeywordProduct zur Tabelle link_keyword_product wird in diesem Beispiel automatisch zur Laufzeit generiert.

php
class Product extends Model
{
    protected static function init(Table $table): void
    {
        $table->setColumns([
            // ...
        ]);
        
        $table->linkedTo('keywords', Keyword::class);
    }
}
php
class Keyword extends Model
{
    protected static function init(Table $table): void
    {
        $table->setColumns([
            // ...
        ]);
        
        $table->linkedTo('products', Product::class);
    }
}

Beispiel 2

todo (Beispiel mit eigenem Link-Model)

php
class Order extends Model
php
class Product extends Model
php
class OrderItem extends Model

Nutzung

todo