Laravel 5.6中updateOrCreate无法填充全部字段问题排查
排查Laravel updateOrCreate字段未保存为NULL的问题
嘿,我来帮你分析这个问题!你的updateOrCreate调用语法看起来没问题,但新插入的记录里expiry、created_date字段是NULL,大概率是下面几个原因导致的:
1. 批量赋值权限未配置(最常见原因)
Laravel默认会保护模型的批量赋值,只有在模型的$fillable数组里声明的字段,才能通过updateOrCreate、create这类批量赋值方法被写入。
你需要检查AppToken模型,确保expiry、created_date、modified_date已经加入到$fillable中:
class AppToken extends Model { protected $fillable = [ 'user_id', 'token', 'expiry', 'created_date', 'modified_date' ]; }
或者如果你想允许所有字段批量赋值,可以设置$guarded为空数组:
protected $guarded = [];
2. 字段名与数据库不匹配
仔细核对你的数据库表结构:
- 确认数据库里的字段名是不是
expiry、created_date、modified_date?比如很多Laravel项目习惯用created_at/updated_at作为时间字段,如果你的数据库里是这个命名,那代码里的created_date自然无法对应,会被存为NULL。
3. 时间字段的自动处理冲突
如果你的模型开启了自动时间戳(默认是开启的,对应$timestamps = true),Laravel会自动维护created_at和updated_at字段。如果你手动设置了created_date,而模型又没关闭自动时间戳,或者字段名冲突,也可能导致值无法正确写入。
如果你的表确实用created_date和modified_date作为时间字段,需要在模型里指定自定义时间戳字段:
class AppToken extends Model { const CREATED_AT = 'created_date'; const UPDATED_AT = 'modified_date'; protected $fillable = [ 'user_id', 'token', 'expiry', 'created_date', 'modified_date' ]; }
这样Laravel会自动用这两个字段来维护时间戳,你甚至不需要手动传入created_date和modified_date,框架会帮你自动设置。
修正后的代码示例
确保模型配置正确后,你的代码可以正常工作,甚至可以简化(如果配置了自定义时间戳):
// 配置了自定义时间戳的话,不需要手动传created_date和modified_date $tokenUpdated = AppToken::updateOrCreate( ['user_id' => $user_id, 'token' => $token], ['expiry' => $expiryTime] );
内容的提问来源于stack exchange,提问作者Saswat
相关产品推荐
相关产品推荐

