You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:58:18