【问题标题】:Polymorphic Relationships and same name model and morphTo function多态关系和同名模型和 morphTo 函数
【发布时间】:2013-10-08 03:19:42
【问题描述】:

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

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

...

在此问题上的任何帮助将不胜感激。

【问题讨论】:

    标签: php orm laravel laravel-4 polymorphic-associations


    【解决方案1】:

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

    从 Tag 和 Track 模型开始 - 在基本的多态关系正常工作后增加额外的复杂性。

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

    【讨论】:

    • 感谢您的建议。我不明白你对中间表的意思是什么增加了我的情况的复杂性。我还有一个封装Tag 逻辑的标签模型。查看更新的问题。
    • 我不明白您为什么需要标签和可标记模型?为什么不简单地将标签变形为跟踪?为什么是 Tag->Taggable->Track 组合?
    • Tag 包含标题和描述等信息,因此感觉应该在它自己的模型中。 Taggable 是让事物拥有Tags 的胶水模型。这有意义吗?
    • 我想知道您是否需要使用 4.1,然后才能将多态的 belongsToMany 作为关系选项 - 我不确定 4.0 中没有的 4.1 功能的文档在哪里,但是您始终可以通过 github 获取 dev 分支的源代码。
    猜你喜欢
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 2019-08-15
    • 2021-02-21
    • 1970-01-01
    • 2014-12-01
    相关资源
    最近更新 更多