Laravel多对多关联保存附加字段时出现SQL字段不存在错误求助
解决Laravel多对多关联附加列保存错误的问题
我一眼就揪出几个导致这个SQL列不存在错误的问题,咱们一步步来修正:
1. 修正模型中withPivot的参数错误
你的withPivot方法里写了带$符号的列名,这完全是搞错了——列名是数据库里的字段名,得是纯字符串,根本不需要加变量符号。而且还有个小细节:多对多关联的两个外键(cart_id和drycleaning_id)是Laravel自动处理的,不需要手动放到withPivot里,withPivot只需要指定额外的附加列就行。
正确的模型关系定义应该是这样:
Cart模型:
public function drycleanings() { return $this->belongsToMany('App\Drycleaning') ->withPivot('q_drycleaning_id'); }
Drycleaning模型:
public function carts() { return $this->belongsToMany('App\Cart') ->withPivot('q_drycleaning_id'); }
(另外建议模型类名用大驼峰命名,比如Drycleaning而不是drycleaning,更符合Laravel的编码规范)
2. 修正控制器中attach的调用格式
你现在的attach方法第二个参数只传了一个值的数组,Laravel根本不知道这个值对应哪个附加列,必须传键值对数组,键就是附加列的字段名,值是要保存的数据。
正确的调用代码应该是:
$cart->drycleanings()->attach($request->drycleaning_id, ['q_drycleaning_id' => $request->q_drycleaning_id]);
额外检查点
最后再确认下你的中间表结构:
- 中间表的命名应该是按字母顺序排列的两个模型名复数,也就是
cart_drycleaning(如果不是的话,需要在belongsToMany的第三个参数指定中间表名) - 中间表必须包含
cart_id、drycleaning_id和q_drycleaning_id这几个字段,确保字段名和你代码里的完全一致(大小写也要注意,数据库字段一般是蛇形命名)
这样修改后,应该就能正常保存附加列的数据了。
内容的提问来源于stack exchange,提问作者mkirr
相关产品推荐
相关产品推荐

