Laravel - 如何设置morphOne关系

Big*_*oss 3 polymorphism relationship laravel eloquent

我正在尝试为类别实现一个可变形表,现在我有以下内容.

// Snippet Table
- id
- title
- body

// Post Table
- id
- title
- body

// Category Table
- id
- name
Run Code Online (Sandbox Code Playgroud)

我希望能够将帖子和片段变形为只有一个类别,如下所示:

// Categorizable Table
- category_id
- categorizable_id
- categorizable_type
Run Code Online (Sandbox Code Playgroud)

我是否必须为此可分类表格提供其他模型?或者有一种方法可以在没有其他模型的情况下设置它?

到目前为止,我有这个

class Snippet extends Model
{
    public function category()
    {
        return $this->morphOne(Category::class, 'categorizable');
    }
}

class Post extends Model
{
    public function category()
    {
        return $this->morphOne(Category::class, 'categorizable');
    }
}

class Category extends Model
{
    public function categorizable()
    {
        return $this->morphTo();
    }
}
Run Code Online (Sandbox Code Playgroud)

我有4个表,snippets,posts,categories,categorizables,最后一个迁移看起来是这样的.

Schema::create('categorizables', function (Blueprint $table) {
    $table->increments('id');
    $table->unsignedInteger('category_id');
    $table->morphs('categorizable');
    $table->timestamps();
});
Run Code Online (Sandbox Code Playgroud)

问题是,保存这种关系的正确方法是什么,我正在修补它们并且两者attach($category_id)sync($category_id)没有保存它们返回错误的关系BadMethodCallException with message 'Call to undefined method Illuminate\Database\Query\Builder::categorizable()',我错过了什么?

yaz*_*eld 8

对不起,我以为你想要多对多的关系.morphOne关系API morphMany文档相同

Post extends Model
{
    public function category() {
        return $this->morphOne(Category::class, 'categorizable');
    }
}

Category extends Model
{
    public function categorizable() {
        return $this->morphTo();
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑 使用morphOne时,您不需要categorizables删除数据透视表,并更改categories表格以包含变形字段

// Category Table
- id
- name
- categorizable_id
- categorizable_type
Run Code Online (Sandbox Code Playgroud)