2016-03-25 4 views
0

Ich habe den ganzen Tag versucht, mich mit diesen polymorphen Beziehungen auseinanderzusetzen. Ich bin vielleicht über das Komplizieren/denke es aber. Kann Laravel mit inversen polymorphen Beziehungen umgehen? Ich habe einen Registrierungsablauf, der zwei Arten von Feldmodellen haben kann: normales Feld und benutzerdefiniertes Feld.was mit einer invertierten polymorphen Beziehung zu tun?

Wenn ich alle verfügbaren Felder durchlaufe, könnte es die Attribute von NormalField oder CustomField ziehen.

<?php 
    foreach($registrationFlow->fields->get() as $field) 
    { 
     echo $field->name; // could be custom field or could be normal field 
    } 
?> 

Mein Problem ist, dass, the example given in der Dokumentation funktioniert, wenn Sie ein Foto entweder Personal oder Aufträge zugewiesen werden sollen, aber ich will entweder eine Custom oder eine normalField zu einem registrationFlow

* zuweisen bearbeiten

Wenn Sie die example for the polymorphic many to many relationship, die Tag-Klasse folgen enthält Beiträge und Videos-, während ich nur ein einfachen Felder wollen würde() -Methode, die custom~~POS=TRUNC oder normalField vom Typ abhängig bezieht

+0

Ich verstehe nicht den Unterschied ? Ich bin mir nicht sicher, was du mit einer "invertierten polymorphen Beziehung" meinst, könntest du klarer sein? – ollieread

+0

Wenn Sie dem offiziellen Beispiel folgen, möchte ich etwas wie $ Fotos-> Artikel - ich denke, diese Antwort zu schreiben hat es klarer in meinem Kopf –

+0

Ich denke, ich habe es besser erklärt –

Antwort

1

Zunächst sollten Sie sich die aktualisierte Dokumentation für Laravel 5.1 ansehen: https://laravel.com/docs/5.1/eloquent-relationships#polymorphic-relations.

Ich denke, die Schwierigkeiten mit dem Beispiel, das sie bieten, ist, dass die Beziehung zwischen Photo und Staff/Product sind „hat-ein“ Beziehungen, während Sie ein zu modellieren versuchen „ist-ein“ -Beziehung. Sie können "is-a" jedoch im Wesentlichen auf die gleiche Weise modellieren. Werfen Sie einen Blick auf diesen Artikel: http://richardbagshaw.co.uk/laravel-user-types-and-polymorphic-relationships/.

Grundsätzlich besteht die Strategie darin, ein generisches Modell (und eine generische Tabelle) zu definieren, vielleicht in Ihrem Fall Field, das sich auf Ihre RegistrationFlow bezieht. Sie haben dann zwei Untertypenmodelle, NormalField und CustomField, die 1: 1-Beziehungen mit Field haben. (da ist dein "ist-a"). So ist RegistrationFlowindirekt bezogen auf Ihre Feld Subtypen.

Polymorphismus kommt, wenn Sie die spezifischen Subtypen zugreifen möchten:

class Field extends Model { 

    public function fieldable() 
    { 
     return $this->morphTo(); 
    } 
} 

Ihre Basis field Tabelle fieldable_id und fieldable_type Spalten (siehe Eloquent docs) definiert haben sollte.

Sie können dann Methoden zu NormalField und CustomField hinzufügen, die Sie das Basismodell zugreifen können (Ihre "inverse Beziehung"):

class NormalField { 

    public function field() 
    { 
     return $this->morphOne('Field', 'fieldable'); 
    } 
} 

class CustomField { 

    public function field() 
    { 
     return $this->morphOne('Field', 'fieldable'); 
    } 
} 

Verbrauch:

$field = Field::find(1); 

// Gets the specific subtype 
$fieldable = $field->fieldable; 
Verwandte Themen