2017-03-22 2 views
2

Ich habe eine polymorphe Beziehung auf Kategorien, sie können zu einem Client oder einer Vorlage gehören.Laravel Polymorphe Beziehung überschreibt bei speichern

Ich versuche, eine Kategorie aus einer Vorlage zu einem Client zuzuweisen. Aber es überschreibt meine Vorlagenkategorien.

Kategorie Model

class Category extends Model 
{ 

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

Client-Modell

class Client extends Model 
{ 
    public function categories() 
    { 
     return $this->morphMany(Category::class, 'categorisable'); 
    } 
} 

Vorlage Modell

class Template extends Model 
{ 
    public function categories() 
    { 
     return $this->morphMany(Category::class, 'categorisable'); 
    } 
} 
Es ist das Überschreiben Sie die 2 Kategorien Aber dann in meinen Kategorien Tisch

Dies ist der Code, den ich über die Kategorien von der Vorlage an den Kunden

$template = Template::find($request->get('template_id')); 
$client = Client::find($request->get('client_id')); 

// For this template, get all categories 
foreach($template->categories as $category) { 
    $client->categories()->save($category); 
} 

zu kopieren bin versucht. Speichern Sie sie auf dem Client, aber entfernen Sie sie aus der Vorlage.

Jede Hilfe würde sehr geschätzt werden! Danke.

Antwort

0

Dies ist sinnvoll. Ihre Tabelle für Category Modell hat zwei Spalten, eine ist für den Typ des Modells, an das es angeschlossen ist, der andere ist für die ID (wahrscheinlich etwas wie categorisable_type (was wäre so etwas wie "App \ Models \ Template") und categorisable_id (die wäre so etwas wie "4")).

Jedes Mal, wenn Sie die bereits vorhandene Kategorie neu zuweisen, werden diese beiden Spalten vom Vorlagenmodell in das Clientmodell umgeschrieben (z. B. in "App \ Models \ Client" und "6").

Sie haben mehrere Möglichkeiten:

1) Ihre Beziehung Typ eigentlich nicht ideal ist. Sie können hier einfach one2many verwenden. Erstellen Sie mehrere Kategorien und weisen Sie dann eine Kategorie-ID in Ihrem Vorlagen- und Kundenmodell auf. Auf diese Weise können Sie die gleiche Kategorie sowohl für die Vorlage als auch für den Client verwenden.

2) Wenn mehrere Kategorien mit jedem Template oder Client verknüpft werden müssen, verwenden Sie die many2many-Beziehung. Der Rest ist ähnlich wie Option 1, Sie haben nur zwei weitere Tabellen, etwa category_client und category_template, vorausgesetzt, Sie folgen der Laravel-Namenskonvention, aber Sie können wirklich alles verwenden, Sie müssen es nur in der Beziehungsmethode angeben.

3) Sie können auch die polymorphe Beziehung many2many verwenden. Sie werden mit clients, templates, categories und categorisable Tabellen enden. categories Tabelle wird nur die Kategorie halten, categorisable wird die Beziehungsdefinition haben, ähnlich wie Option 2.

4) Wenn Sie darauf bestehen, one2many polymorphe Beziehungen hier zu verwenden (Rat: nicht), können Sie jede Vorlage für jeden Client klonen, dem Sie sie zuweisen, aber das macht null Sinn und Sie werden es nicht haben die gleiche Kategorie an Ihre Template oder Client, nur der Klon des Originals angeschlossen, daher werden Sie nicht in der Lage sein, Zugriff templates oder client aus dem Category umgekehrt, da sie beide zu einer anderen Kategorie gehören.

Die Methoden 1 und 2 kehren die gesamte Beziehung in der richtigen Reihenfolge um, da Ihre aktuelle Logik umgekehrt und, wie erwähnt, nicht ideal ist.

Weitere Informationen hier - https://laravel.com/docs/5.4/eloquent-relationships (Für Laravel 5.4, das ist die neueste Version zu der Zeit, als ich dies schreibe).

Verwandte Themen