Laravel:Eloquent 模型中的多态关系

4
我有一个名为“Comments”的表格,其结构如下:
Schema::create('comments', function (Blueprint $table) {
$table->increments('id');
$table->morphs('commentable');
$table->morphs('creatable');
$table->text('comment');
$table->timestamps();
});

雄辩的文件

class Comment extends Model
{
    public $fillable = ['comment'];

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

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

我有两个多态关系:
- `commentable` 可用于任何文章 / 帖子或视频 - `creatable` 仅限于评论创建者,可以是评论用户 / 管理员
如何对用户创建的帖子添加评论?
我尝试使用以下代码创建:
public function addComment($creatable, $comment)
{
        $this->comments()->create(['comment' => $comment, 'creatable' => $creatable]);
}

它确实起作用了,我收到了以下错误信息。
Illuminate/Database/QueryException with message 'SQLSTATE[HY000]: General error: 1364 Field 'creatable_type' doesn't have a default value (SQL: insert into `post_comments` (`comment`, `commentable_id`, `commentable_type`, `updated_at`, `created_at`) values (Test Comment, 1, App/Post, 2018-08-31 10:29:14, 2018-08-31 10:29:14))'

提前致谢!

在你的模型中添加错误和关系。 - J. Doe
信息已添加 @J.Doe - Akshay Khale
你的 Comment 模型应该只有一个方法。此外,如果你想使用默认的多态关联,comments 表格应该具有不同的结构,包括 commentable_idcommentable_type。再次检查文档。如果我没有弄错的话,你的 comments 表格具有比所需更多的字段。 - Tpojka
我的实现与文档中给出的不同,在文档中他们只涉及单一的多态关系,而在我的情况下,我需要多重关系。由于 $table->morphs('commentable');commentable_idcommentable_type将自动添加到表中。@Tpojka - Akshay Khale
很难在没有看到表格图表的情况下说出来,但也许你需要在表格中使用$table->nullableMorphs('commentable');$table->nullableMorphs('creatable');(允许空值)? - Tpojka
1个回答

6
您可以使用make()函数:
public function addComment($creatable, $comment)
{
        $this->comments()->make(['comment' => $comment])
            ->creatable()->associate($creatable)
            ->save();
}

我尝试了这段代码,但它没有起作用。我甚至在函数开头尝试了 enableQueryLog(),并在结尾处使用了 getQueryLog(),但它返回了 [] - Akshay Khale
你是怎么调用 addComment() 方法的? - Jonas Staudenmeir
$user 是来自数据库 (User::find()) 还是新创建的 (new User())? - Jonas Staudenmeir
这个答案有效,是我犯了一个错误,我尝试使用了“associates”而不是“associate”,感谢您的回答,很抱歉浪费了您的时间。 - Akshay Khale
我需要在返回值中使用模型而不是布尔值吗? - Abhi Burk
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接