修复在显示技能使用记录时,used_at字段调用format方法失败的错误
Call to a member function format() on string in FarmUserSummaryController.php:1062
在getRecentSkillUsageSection方法中,代码假设$log->used_at是Carbon对象,直接调用format()方法:
$usedAt = $log->used_at->format('Y-m-d H:i:s');
但实际上,used_at字段可能是字符串类型,导致调用format()方法失败。
PetSkillLog模型中使用了过时的$dates属性将过时的$dates属性改为现代的$casts属性:
// 修改前
protected $dates = [
'used_at',
'created_at',
];
protected $casts = [
'pet_id' => 'integer',
'skill_id' => 'integer',
'effect_result' => 'json',
];
// 修改后
protected $casts = [
'pet_id' => 'integer',
'skill_id' => 'integer',
'used_at' => 'datetime',
'created_at' => 'datetime',
'effect_result' => 'json',
];
// 安全处理时间格式
$usedAt = '未知时间';
if ($log->used_at) {
try {
if ($log->used_at instanceof \Carbon\Carbon) {
$usedAt = $log->used_at->format('Y-m-d H:i:s');
} else {
// 尝试解析字符串时间
$usedAt = date('Y-m-d H:i:s', strtotime($log->used_at));
}
} catch (\Exception $e) {
$usedAt = (string) $log->used_at;
}
}
} catch (\Throwable $e) {
// 如果出现异常,添加一个错误行
$usedAtDisplay = '未知';
if ($log->used_at) {
try {
if ($log->used_at instanceof \Carbon\Carbon) {
$usedAtDisplay = $log->used_at->format('Y-m-d H:i:s');
} else {
$usedAtDisplay = (string) $log->used_at;
}
} catch (\Exception $e) {
$usedAtDisplay = '时间格式错误';
}
}
$rows[] = [
$usedAtDisplay,
// ... 其他字段
];
}
app/Module/Pet/Models/PetSkillLog.php - 更新模型配置app/Module/Game/AdminControllers/FarmUserSummaryController.php - 增加安全的时间处理$dates属性$casts中添加used_at和created_at的datetime转换protected $dates = ['used_at', 'created_at'];
protected $casts = [
'used_at' => 'datetime',
'created_at' => 'datetime',
];
if ($log->used_at instanceof \Carbon\Carbon) {
// Carbon对象,可以安全调用format方法
$usedAt = $log->used_at->format('Y-m-d H:i:s');
} else {
// 字符串或其他类型,使用PHP原生函数处理
$usedAt = date('Y-m-d H:i:s', strtotime($log->used_at));
}
instanceof检查对象类型$casts属性定义字段类型$dates属性✅ 已完成
app/Module/Pet/Models/PetSkillLog.php - 宠物技能使用记录模型app/Module/Game/AdminControllers/FarmUserSummaryController.php - 农场用户信息汇总控制器