You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel多对多多态关系执行数据填充时出现SQL错误如何解决

错误1:Call to a member function bookmarkItems() on int 根因

你最初的循环代码里$post = Post::all()->random()->id直接取了主键值,得到的是int类型数据,不是Post模型实例,自然无法调用模型的关联方法。你自己修改为取Post::all()->random()实例的操作是正确的,可直接解决该报错。

错误2:Field 'bookmarks_id' doesn't have a default value 根因与修复

出现该错误有两个核心原因:

  1. BookmarkItems模型未配置字段白名单:Laravel默认会拦截不在$fillable属性中的字段写入,你手动赋值的bookmarks_id没有被纳入白名单,写入数据库时会被直接忽略。
  2. 多对多多态关联的save方法默认只会自动填充多态对应的bookmark_items_id、bookmark_items_type两个字段,额外字段需要单独配置才能正常写入。

修复步骤

  1. 给BookmarkItems模型添加字段白名单:
class BookmarkItems extends Model
{
    // 新增这行,允许bookmarks_id字段批量赋值
    protected $fillable = ['bookmarks_id'];

    public function posts(): \Illuminate\Database\Eloquent\Relations\MorphToMany
    {
        return $this->morphedByMany(Post::class, 'bookmark_items');
    }

    public function comments(): \Illuminate\Database\Eloquent\Relations\MorphToMany
    {
        return $this->morphedByMany(Comment::class, 'bookmark_items');
    }
}
  1. 修正循环代码,确保取到Post模型实例:
foreach (range(1, 6) as $index) {
    // 取Post模型实例,不要只取id
    $post = Post::all()->random();
    $bookmarkItems = new BookmarkItems();
    $bookmarkItems->bookmarks_id = Bookmark::all()->random()->id;
    $post->bookmarkItems()->save($bookmarkItems);
}

如果需要简化写法,也可以直接用create+attach的组合实现相同逻辑:

foreach (range(1, 6) as $index) {
    $post = Post::all()->random();
    $post->bookmarkItems()->attach(
        BookmarkItems::create(['bookmarks_id' => Bookmark::all()->random()->id])
    );
}

内容的提问来源于stack exchange,提问作者HashtagForgotName

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 17:57:05