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.
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äfixLink
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.
class Product extends Model
{
protected static function init(Table $table): void
{
$table->setColumns([
// ...
]);
$table->linkedTo('keywords', Keyword::class);
}
}
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)
class Order extends Model
class Product extends Model
class OrderItem extends Model
Nutzung
todo