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

Laravel中直接访问created_at与value('created_at')返回值不一致问题排查

Laravel 10中模型created_at属性直接访问与value()方法结果不一致的原因

问题复现

数据库中companies表某条记录的created_at字段存储值为2025-01-15 14:01:26,通过以下代码获取值时出现差异:

$company = Company::find($user->company_id);

// 直接访问属性,返回正确的Carbon实例(对应数据库存储值)
$createdAtDirect = $company->created_at;

// 调用value()方法,返回表中第一条记录的created_at对应的Carbon实例
$createdAtValue = $company->value('created_at');

输出结果显示两者日期完全不同,前者为2025-01-15 14:01:26,后者为2023-09-19 14:26:39。

核心原因

两种取值方式的底层逻辑存在本质区别:

  • 直接访问属性:从模型已加载到内存的属性集合中读取数据,该数据是find()方法查询时获取的当前实例对应记录的字段值,Laravel自动将其转换为Carbon实例,结果与数据库存储一致。
  • 调用value()方法:模型实例的value()方法会创建全新的查询构造器,执行SELECT created_at FROM companies LIMIT 1的SQL语句,返回数据表中第一条记录的created_at值,而非当前实例对应记录的值。

这是Laravel框架的设计逻辑:模型实例的value()方法未限定查询范围,默认针对整个表执行取首条数据指定字段的操作。

正确取值方式

若需获取当前模型实例的created_at值,推荐使用以下无额外数据库查询的方式:

  • 直接访问属性:$company->created_at
  • 从模型属性数组读取原始字符串:$company->attributes['created_at']

若必须通过查询方式获取当前实例的字段值,需手动限定查询条件:

$createdAtValue = Company::where('id', $company->id)->value('created_at');

内容的提问来源于stack exchange,提问作者David Cortesi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 00:34:55