Laravel多对多关联保存失败,提示未知列'send_message_id'
解决Laravel多对多关联保存时的"Unknown column 'send_message_id'"错误
错误原因
Laravel多对多关联默认会以模型单数名_id作为外键字段名,你的SendMessage模型会被框架解析为单数send_message,因此会自动去中间表查找send_message_id字段,但你的中间表实际定义的是send_messages_id,字段名不匹配导致报错。
修复步骤
1. 修正模型的多对多关联定义
在Customer和SendMessage模型的belongsToMany方法中,明确指定关联对应的外键字段:
Customer模型:
class Customer extends Model { use HasFactory; protected $table = "customer"; protected $fillable = [ "customer_phone" ]; public function sendmessages () { // 参数依次:关联模型、中间表名、当前模型在中间表的外键、关联模型在中间表的外键 return $this->belongsToMany(SendMessage::class, "customer_send_message", "customer_id", "send_messages_id"); } }
SendMessage模型:
class SendMessage extends Model { use HasFactory; protected $table = "send_messages"; // 移除fillable里的customer_id,多对多关联不需要该字段 protected $fillable = [ "template_id", "sender_number_id" ]; public function messageContent() { return $this->belongsTo(MessageContentModel::class); } public function senderNumber() { return $this->belongsTo(SendNumberModel::class); } public function customers() { return $this->belongsToMany(Customer::class, "customer_send_message", "send_messages_id", "customer_id"); } }
2. 调整控制器的保存逻辑
attach操作需要依赖已保存模型的主键ID,因此必须先将SendMessage保存到数据库,再执行关联操作:
public function send(Request $request) { $sendmessage = new SendMessage(); $sendmessage->template_id = $request->get("template_id"); $sendmessage->sender_number_id = $request->get("sender_number_id"); // 先保存模型生成ID $sendmessage->save(); // 关联单个Customer,直接传ID即可 $sendmessage->customers()->attach(1); // 若要关联多个,传数组:attach([1,2,3]) return redirect("")->with("message", "Sms sent!"); }
3. 可选:贴合Laravel命名规范(优化)
Laravel推荐中间表外键用模型单数名_id,如果修改中间表迁移的字段名,可简化关联定义:
Schema::create('customer_send_message', function (Blueprint $table) { $table->id(); $table->timestamps(); // 将send_messages_id改为单数send_message_id $table->foreignId("send_message_id")->constrained("send_messages"); $table->foreignId("customer_id")->constrained("customer"); });
修改后,模型的关联定义可省略外键参数,框架会自动识别匹配。
内容的提问来源于stack exchange,提问作者Sakib ovi
相关产品推荐
相关产品推荐

