Laravel关联模型调用updateOrCreate报错:为何查询id为null?
为什么调用updateOrCreate会出现where id is null的错误?
嘿,这个问题我之前踩过类似的坑,咱们一步步拆解原因和解决办法:
直接原因:Car模型的主键配置不符合你的表结构
Laravel的模型默认会把id当作表的主键字段,但你的cars表里根本没有id列——你用idMember来关联用户,同时这个字段也是cars表的唯一标识。
当你调用$user->car()->updateOrCreate(...)时,Laravel会先根据条件查找对应的Car记录:它找到了idMember=1的那条记录,但因为Car模型默认主键是id,而这条记录没有id值,Laravel就认为这条记录的主键是null。后续执行更新操作时,自然就生成了where id is null的错误SQL,最终触发了字段找不到的报错。
解决步骤
1. 给Car模型指定正确的主键
在App\Car模型里添加两行配置,告诉Laravel你的主键字段是什么:
// 指定cars表的主键为idMember protected $primaryKey = 'idMember'; // 如果idMember不是自增整数类型(比如和user的id一致是整数,也可以加上这条更稳妥) public $incrementing = false;
2. 优化updateOrCreate的调用(可选但推荐)
因为你是通过用户的关联car()来调用方法,Laravel已经自动把idMember = $user->id这个关联条件加到查询里了,所以你完全可以省略第一个参数里的冗余条件,简化成:
$user->car()->updateOrCreate([], ['color' => 'red', 'energy' => '0.1']);
这样调整后,Laravel就能正确定位到idMember=1的记录,更新时会生成where idMember = 1的条件,再也不会出现找不到列的错误了。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

