【问题标题】:Laravel - How to setup a morphOne relationshipLaravel - 如何设置 morphOne 关系
【发布时间】:2017-10-01 22:42:22
【问题描述】:

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

// Snippet Table
- id
- title
- body

// Post Table
- id
- title
- body

// Category Table
- id
- name

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

// Categorizable Table
- category_id
- categorizable_id
- categorizable_type

对于这个可分类的表格,我是否必须有另一个模型?或者有一种方法可以在没有其他模型的情况下设置它?

到目前为止我有这个

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

我有 4 个表,snippetspostscategoriescategorizables,最后一个迁移看起来像这样。

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

问题是,保存这种关系的正确方法是什么,我正在 tinker 上对其进行测试,attach($category_id)sync($category_id) 都没有保存关系,它们返回错误 BadMethodCallException with message 'Call to undefined method Illuminate\Database\Query\Builder::categorizable()',我是什么我失踪了?

【问题讨论】:

  • @yazfield 文档显示了一个 morphToMany,但事实并非如此,我需要一个 morphOne,以一对一的多态关系。

标签: laravel eloquent polymorphism relationship


【解决方案1】:

抱歉,我以为你想要多对多关系。 morphOne 关系 API 与来自 docsmorphMany 相同

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

Category extends Model
{
    public function categorizable() {
        return $this->morphTo();
    }
}

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

// Category Table
- id
- name
- categorizable_id
- categorizable_type

【讨论】:

  • 感谢您的回复,我已经根据您的回答更新了我的问题,但我想我遗漏了一些东西,类别关系总是返回 null,我在数据库中设置了一些项手,即使这样它也返回null,我无法保存关系或返回它。
  • 我现在明白了,谢谢你的帮助,最后,我不认为这是我需要的。 =/
  • 我做了这个,但没有工作,发现我需要再做一步。在 Relation::morphMap 中添加一个条目,即Relation::morphMap([ 'category' => Category::class ]); 参考:Laravel docs
  • 不仅是“morphOne”,您不需要数据透视表。对于“morphMany”,您也不需要它。当然,当它是 N 对 N 关系时除外。
  • 为什么答案和文档没有说明如何使用它
猜你喜欢
  • 1970-01-01
  • 2018-09-12
  • 2015-02-16
  • 1970-01-01
  • 2016-03-31
  • 2017-06-25
  • 2017-06-02
  • 2017-07-20
  • 2020-05-09
相关资源
最近更新 更多