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

如何在Laravel JSON API响应中移除模型的时间戳字段?

嘿,这个问题其实在Laravel里有好几种简单直接的解决办法,不用纠结复杂的中间件或者响应宏,我给你整理几个常用方案,按需选就行:

方案1:在模型中全局隐藏时间戳(最简单)

如果只是不想让某个模型的时间戳在所有API响应里出现,直接在模型类里配置$hidden属性,把要隐藏的时间戳字段加进去就行:

class YourModel extends Model
{
    // 把时间戳字段加入隐藏列表,序列化时会自动排除
    protected $hidden = ['created_at', 'updated_at'];
    
    // 如果你的模型用了软删除,还要隐藏deleted_at的话,直接加上
    // protected $hidden = ['created_at', 'updated_at', 'deleted_at'];
}

要是你完全不需要这个模型的时间戳功能(连数据库里的时间戳字段都不用维护),还可以直接关闭时间戳:

class YourModel extends Model
{
    // 关闭Laravel自动维护created_at/updated_at的功能
    public $timestamps = false;
}

⚠️ 注意:关闭$timestamps后,Laravel不会再自动给数据库的时间戳字段赋值,适合确实不需要时间戳的场景。

方案2:用API资源精确控制响应(最灵活)

如果你的API需要定制响应结构,尤其是关联对象的返回内容,API资源是最佳选择,能精准控制每个返回字段:

  1. 先创建对应模型的资源类:
php artisan make:resource YourModelResource
  1. 在生成的资源类的toArray方法里,只返回你需要的字段,排除时间戳:
namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class YourModelResource extends JsonResource
{
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            // 这里只放你想返回的字段,不要包含created_at/updated_at
            // 关联对象也可以用资源嵌套,同样能控制它的返回字段
            'related_object' => new RelatedModelResource($this->relatedObject),
        ];
    }
}
  1. 控制器里返回这个资源即可:
public function show($id)
{
    $model = YourModel::with('relatedObject')->findOrFail($id);
    return new YourModelResource($model);
}

这种方式的好处是,关联对象的资源也能单独配置隐藏时间戳,完全掌控API响应的结构。

方案3:临时隐藏字段(针对单个请求)

如果只是某个特定请求需要隐藏时间戳,不想全局修改模型,用makeHidden方法临时处理就行:

public function show($id)
{
    $model = YourModel::with('relatedObject')->findOrFail($id);
    
    // 隐藏当前模型的时间戳
    $model->makeHidden(['created_at', 'updated_at']);
    // 关联对象也要隐藏的话,同样调用makeHidden
    $model->relatedObject->makeHidden(['created_at', 'updated_at']);
    
    return response()->json($model);
}
补充:中间件方案(适合全局批量处理)

要是你想给所有API响应统一移除时间戳,也可以用中间件实现:

  1. 创建中间件:
php artisan make:middleware RemoveTimestamps
  1. 编写中间件逻辑:
namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Response;

class RemoveTimestamps
{
    public function handle($request, Closure $next)
    {
        $response = $next($request);
        
        // 判断响应是数组格式的话,移除时间戳字段
        if ($response instanceof Response && is_array($response->original)) {
            unset($response->original['created_at'], $response->original['updated_at']);
            
            // 如果有嵌套的关联对象,比如related_object,也一起移除
            if (isset($response->original['related_object'])) {
                unset($response->original['related_object']['created_at'], $response->original['related_object']['updated_at']);
            }
        }
        
        return $response;
    }
}
  1. 在app/Http/Kernel.php里注册中间件,比如加入api中间件组:
protected $middlewareGroups = [
    'api' => [
        // ...其他中间件
        \App\Http\Middleware\RemoveTimestamps::class,
    ],
];

不过这个方法需要适配你的响应结构,不如前面的方案灵活,适合所有API响应结构一致的场景。

总的来说,优先推荐模型$hidden或者API资源,前者简单快捷,后者灵活可控,能覆盖绝大多数场景。

内容的提问来源于stack exchange,提问作者frankfurt-laravel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:47:37