Laravel Livewire项目关联同步报SQLSTATE[42S22字段不存在错误如何解决
问题原因
你报错的核心原因是两个模型的多对多关联定义中,navigation_menu_id参数前多了一个多余的空格,Laravel会把空格识别为字段名的一部分,自然匹配不到迁移文件里定义的无空格的navigation_menu_id字段。
除此之外你还有多对多外键顺序写反的问题,belongsToMany的第三个参数是「当前模型在中间表的外键」,第四个是「关联模型在中间表的外键」,你现有代码的参数顺序不符合规则。
修正方案
1. 修正NavigationMenu模型的关联代码
class NavigationMenu extends Model { protected $primaryKey = 'navigation_menus_id'; public function navigationType() { // 第三个参数为当前模型(NavigationMenu)在中间表的外键 // 第四个参数为关联模型(NavigationMenuType)在中间表的外键 // 同时删除参数里多余的空格 return $this->belongsToMany(NavigationMenuType::class,'navigation_menus_navigation_types','navigation_menu_id','navigation_type_id'); } }
2. 修正NavigationMenuType模型的关联代码
class NavigationMenuType extends Model{ protected $primaryKey = 'navigation_menu_types_id'; public function navigationMenu() { // 第三个参数为当前模型(NavigationMenuType)在中间表的外键 // 第四个参数为关联模型(NavigationMenu)在中间表的外键 // 同时删除参数里多余的空格 return $this->belongsToMany(NavigationMenu::class,'navigation_menus_navigation_types','navigation_type_id','navigation_menu_id'); } }
额外校验项
- 如果之前已经执行过迁移,确认中间表字段已正确创建,异常情况下可回滚后重新执行迁移:
php artisan migrate:rollback && php artisan migrate - 控制器内变量
seletedNavigationMenu为拼写错误(正确应为selectedNavigationMenu),不影响功能运行仅为代码规范问题。
内容的提问来源于stack exchange,提问作者Christopher Paz
相关产品推荐
相关产品推荐

