2013-10-01 73 views
2

所以我試圖創建一個taggable表,它使多個models有與他們相關的標籤,並認爲Laravel的Polymorphic relationships將是路要走。多態關係和同名模型和morphTo函數

不幸的是我似乎無法讓他們在以下設置中工作。正如我在運行php artisan migrate:refresh --seed時收到以下錯誤。

{"error":{"type":"Symfony\\Component\\Debug\\Exception\\FatalErrorException","message":"Class name must be a valid object or a string","file":"...\\vendor\\laravel\\framework\\src\\ 
Illuminate\\Database\\Eloquent\\Model.php","line":527}} 

我相信這個問題是由於該Taggable模型命名爲下面列出的相同morphTo的事實。由於更改此問題可以解決問題。爲什麼會造成問題?

加標籤模式

class Taggable extends Eloquent { 

    protected $table = 'taggable'; 

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

軌道模型

class Track extends Eloquent { 

    protected $table = 'tracks'; 

    protected $fillable = array('title', 'year', 'image'); 

    protected $guarded = array('id'); 

    public function playlists() 
    { 
     return $this->belongsToMany('Playlist'); 
    } 

    public function tags() 
    { 
     return $this->morphMany('Taggable', 'taggable'); 
    } 
} 

標籤模式

class Tag extends Eloquent { 

    protected $table = 'tags'; 

    protected $fillable = array('title', 'description'); 

    protected $guarded = array('id'); 
} 

遷移

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

DatabaseSeeder SNIPPIT

... 

DB::table('taggable')->delete(); 

$track1 = Track::find(1); 

$idm = Tag::find(1); 

$track1->tags()->create(array('tag_id' => $idm->id)); 

... 

任何幫助會在這個問題上大加讚賞。

回答

2

嘗試簡化您的關係 - 您似乎正在使用中間表來允許標記重用 - 這是值得讚揚的,但會使您的問題變得複雜。

從標記和跟蹤模型開始 - 在基本多態關係工作後增加額外的複雜性。

此外,問題可能是您的模型使用了與實際關係函數命名相同的名稱。 IE Taggable-> taggable()vs Tag-> taggable()

+0

感謝您的建議。我不明白你對中間表的含義增加了我的情況的複雜性。我也有一個Tag模型來封裝'Tag'邏輯。查看更新的問題。 – Malachi

+0

我不明白你爲什麼需要一個標籤和一個Taggable模型?你爲什麼不簡單地將標籤變形爲跟蹤?爲什麼Tag-> Taggable-> Track組合? –

+0

'標籤'包含標題和描述等信息,所以感覺應該是它自己的模型。 'Taggable'是膠水模型,使事物具有'標籤'。那有意義嗎? – Malachi