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 根因与修复
出现该错误有两个核心原因:
BookmarkItems模型未配置字段白名单:Laravel默认会拦截不在$fillable属性中的字段写入,你手动赋值的bookmarks_id没有被纳入白名单,写入数据库时会被直接忽略。- 多对多多态关联的
save方法默认只会自动填充多态对应的bookmark_items_id、bookmark_items_type两个字段,额外字段需要单独配置才能正常写入。
修复步骤
- 给
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'); } }
- 修正循环代码,确保取到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
相关产品推荐
相关产品推荐

