2016-02-28 10 views
5

Sto leggendo laravel 5.2 documenti per implementare molte o molte relazioni polimorfiche nella mia applicazione Laravel. Ho molti modelli come Blog, Question, Photo ecc. E voglio avere un sistema di Tagging per tutti loro. ho creato tabella delle variabili con seguente schemaCome utilizzare la relazione polimorfica da molti a molti in Laravel 5.2

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

Di seguito è riportato schema della tabella pivot. nome della tabella pivot è 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'); 
}); 

Questo è il rapporto definito nella Tag modello per Question modello

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

E la seguente relazione è definito in Question Modello

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

Ora voglio definire da molti a molti la relazione Polimorfica come definita in Laravel 5.2.
La mia domanda sono

  • come posso definire?
  • Devo rimuovere la relazione Molti a Molti e definire solo una relazione polimorfica da Molte a Molte? In caso affermativo, come gestire il nome della tabella pivot personalizzata?
  • Inoltre è necessario il suffisso del nome della colonna con la parola able che fa parte della relazione polimorfa ?

risposta

4
  • Usa return $ this-> morphToMany() al posto di belongsToMany, e nel modello di tag, scrivere 3 metodi con ritorno a $ this-> morphedByMany() per la relazione inversa.

  • Hai solo bisogno di definizioni polimorfiche, non è necessario per molti a molti quelli normali. Il nome della tabella pivot è con 'able' alla fine della convenzione di default, ma puoi chiamarlo come vuoi.

  • no, non è necessario avere una parola con "in grado" alla fine, è solo un modo per definire che è qualcosa di più generale, è possibile denominarlo tutto ciò che si desidera.

Il nome si basa su alcune convenzioni di default di Laravel.

Aggiornamento:

si hanno le seguenti schema della tabella pivot:

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'); 
}); 

e la tabella tag:

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

Così si vuole creare le relazioni per blog, video e la domanda tavoli/modelli:

Tag.php Modello:

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

ho provato la soluzione, ma al di sotto è l'errore, quando io stavo salvando una nuova domanda 'SQLSTATE [42S22] : Colonna non trovata: 1054 Colonna sconosciuta 'tagz_type' in 'where clausola' (SQL: selezionare 'entity_type' da 'entity_tags' dove 'entity_id' = 4 e 'tagz_type' = App \ Question) ' Penso che il secondo parametro dovrebbe essere 'xyz' –

+0

Un'altra cosa, invece di' xyz_id' e 'xyz_type', ho usato' entity_id' e 'entity_type' –

Problemi correlati