Laravel 5.6中fill()方法尝试使用不存在的'id'字段更新表
问题排查与解决方法
我来帮你搞定这个Laravel的坑!
错误原因分析
Laravel的Eloquent模型默认会假设你的数据库表有一个名为id的自增主键字段,当你调用fill()(或者其他Eloquent操作)时,模型会自动尝试处理这个id字段。但从你的迁移代码片段和报错信息来看:
- 你的
organization_profiles表根本没有id字段(迁移里开头是$table->unsignedInteger('organizati...'),大概率是截断了,完整应该是organization_id,作为关联主表的外键同时作为本表主键) - 模型没有告诉Eloquent要使用自定义主键,所以框架还在傻乎乎地找不存在的
id字段,自然报错。
解决方法
方法1:给模型指定自定义主键(推荐)
既然你的表用的是organization_id作为主键(一对一关联场景下常见的设计,比如每个机构对应一个资料表),直接在OrganizationProfile模型里添加两个属性即可:
<?php namespace App; use Illuminate\Database\Eloquent\Model; class OrganizationProfile extends Model { // 指定本表的主键字段(替换成你实际的主键名) protected $primaryKey = 'organization_id'; // 因为你的主键是unsignedInteger(非自增),所以要关闭自增标识 public $incrementing = false; protected $fillable = [ 'logo', 'number_of_employees', 'siup', 'npwp', 'year_established', 'join_ppsdm', 'industry_sector', 'address', 'city', 'province', 'country', 'postal_code', 'organization_phone', 'organization_email' ]; }
这样Eloquent就会用你指定的organization_id作为主键,不会再去寻找不存在的id字段了。
方法2:给表添加id自增主键(如果设计需要)
如果你的表本来就应该有默认的id主键,只是迁移时漏写了,可以修改迁移文件(未运行过迁移直接改,已运行则生成新迁移)添加:
Schema::create('organization_profiles', function (Blueprint $table) { // 添加自增主键id $table->increments('id'); // Laravel 5.6也可以用$table->id(),不过increments更兼容旧版本 $table->unsignedInteger('organization_id'); // 其他字段... });
然后运行迁移命令:
php artisan migrate
不过从你的模型设计来看,这种场景概率较低,更推荐方法1。
额外注意:调用fill()的正确姿势
确保你是先找到对应的模型实例再调用fill(),比如:
// 用自定义主键查找记录 $profile = OrganizationProfile::find($organizationId); // 填充更新数据 $profile->fill($request->only($profile->fillable)); $profile->save();
内容的提问来源于stack exchange,提问作者Reno Wijoyo
相关产品推荐
相关产品推荐

