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
相关产品推荐
相关产品推荐

