2016-02-28 3 views
5

Ich lese Laravel 5.2 Dokumente, um viele zu viele polymorphe Beziehung in meiner Laravel-Anwendung zu implementieren. Ich habe viele Modelle wie Blog, Question, Photo etc und ich möchte Tagging-System für alle von ihnen haben. I Tag-Tabelle mit folgendem Schema erstellt habenWie zu viele polymorphe Beziehung in Laravel verwenden 5.2

Schema::create('tags', function (Blueprint $table) { 
     $table->increments('id'); 
     $table->string('name'); 
     $table->string('slug')->unique(); 
     $table->timestamps(); 
    }); 

Im Folgenden finden Sie Pivot-Tabellenschema. Pivot-Tabelle Name ist entity_tags

Schema::create('entity_tags', function (Blueprint $table) { 
    $table->increments('id'); 
    $table->integer('tag_id')->unsigned();; 
    $table->integer('taggable_id')->unsigned(); 
    $table->string('taggable_type'); 
    $table->timestamps(); 
    $table->index('tag_id'); 
    $table->index('taggable_id'); 
    $table->index('taggable_type'); 
}); 

Dies ist die Beziehung in Tag Modell für Question Modell definiert ist

public function questions() 
{ 
    return $this->belongsToMany('App\Question', 'entity_tags', 'tag_id', 'taggable_id'); 
} 

Und die folgende Beziehung definiert in Question Modell

public function tags() 
{ 
    return $this->belongsToMany('App\Tag', 'entity_tags', 'taggable_id', 'tag_id'); 
} 

Jetzt möchte ich Definiere viele bis viele polymorphe Beziehungen wie in Laravel 5.2 definiert.
Meine Frage ist

  • , wie ich sie definieren?
  • Sollte ich die Viele zu Viele Beziehung entfernen und nur viele zu viele polymorphe Beziehung definieren? Wenn ja, wie wird der Name der benutzerdefinierten Pivot-Tabelle verwaltet?
  • Ist es auch erforderlich, den Spaltennamen mit dem Wort able zu ergänzen, die Teil der polymorphen Beziehung sind?

Antwort

4
  • Verwenden return $ this-> morphToMany() anstelle von belongsToMany und im Tag-Modell, schreiben 3 Methoden mit return $ this-> morphedByMany() für die umgekehrte Beziehung.

  • Sie brauchen nur polymorphe Definitionen, keine Notwendigkeit für die vielen zu vielen normalen. Der Name der Pivot-Tabelle ist am Ende durch die Standardkonvention mit 'able' versehen, aber Sie können ihn beliebig benennen.

  • Nein, Sie müssen am Ende kein Wort mit "fähig" haben, es ist nur eine Möglichkeit zu definieren, dass es etwas allgemeiner ist, Sie können es nennen, was Sie wollen.

Die Benennung basiert auf einer Standardkonvention von Laravel.

Update:

Sie haben die folgende Pivot-Tabellenschema:

Schema::create('entity_tags', function (Blueprint $table) { 
     $table->increments('id'); 
     $table->integer('tag_id')->unsigned();; 
     $table->integer('entity_id')->unsigned(); 
     $table->string('entity_type'); 
     $table->timestamps(); 
     $table->index('tag_id'); 
     $table->index('entity_id'); 
     $table->index('entity_type'); 
}); 

und die Tags Tabelle:

Schema::create('tags', function (Blueprint $table) { 
    $table->increments('id'); 
    $table->string('name'); 
    $table->string('slug')->unique(); 
    $table->timestamps(); 
}); 

So wollen Sie die Beziehungen für Blog, Video und Fragen erstellen Tabellen/Modelle:

Tag.php Modell:

public function questions() 
{ 
    return $this->morphedByMany('App\Question', 'entity', 'entity_tags'); 
} 

public function blogs() 
{ 
    return $this->morphedByMany('App\Blog', 'entity', 'entity_tags'); 
} 

public function videos() 
{ 
    return $this->morphedByMany('App\Video', 'entity', 'entity_tags'); 
} 

Question.php/blog.php/video.php

public function tags() 
{ 
    return $this->morphToMany('App\Tag', 'entity', 'entity_tags'); 
} 
+0

ich die Lösung versucht, aber unten ist der Fehler, wenn ich eine neue Frage 'SQLSTATE [42S22] Speichern : Spalte nicht gefunden: 1054 Unbekannte Spalte 'tagz_type' in 'where-Klausel' (SQL: select 'entity_type' aus 'entity_tags' wobei 'entity_id' = 4 und 'tagz_type' = App \ Question) ' Ich denke, der zweite Parameter sollte 'xyz' sein –

+0

Noch eine Sache, anstelle von' xyz_id' und 'xyz_type' habe ich' entity_id' und 'entity_type' verwendet –