多态关系和同名模型和形态函数


Polymorphic Relationships and same name model and morphTo function

所以我正在尝试创建一个taggable表,使多个models能够具有与之关联的标签,并认为Laravel的多态关系将是要走的路。

不幸的是,我似乎无法让他们在以下设置中工作。因为我在运行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));
...

在这个问题上有任何帮助将不胜感激。

尝试简化您的关系 - 您似乎正在使用中间表来允许标签重用 - 这是值得称赞的,但使您的问题复杂化。

从标记和跟踪模型开始 - 在基本多态关系工作后增加额外的复杂性。

此外,问题可能是您对模型使用的名称与实际关系函数的名称相同。IE Taggable->taggable() vs Tag->taggable()