Laravel中如何将Eloquent模型蛇形属性序列化为驼峰式?
解决方案:Laravel Eloquent 蛇形属性转驼峰式JSON输出
不需要额外引入第三方库,Laravel本身就有几种优雅的实现方式,推荐按以下优先级选择:
1. 使用API资源类(推荐)
API资源是Laravel官方推荐的API输出格式化方案,灵活性高,便于维护:
步骤1:生成User资源类
php artisan make:resource UserResource
步骤2:修改资源类的toArray方法
<?php namespace App\Http\Resources; use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\Str; class UserResource extends JsonResource { /** * 将资源转换为数组。 * * @param \Illuminate\Http\Request $request * @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable */ public function toArray($request) { $rawAttributes = $this->resource->toArray(); $camelCaseAttributes = []; foreach ($rawAttributes as $snakeKey => $value) { $camelCaseAttributes[Str::camel($snakeKey)] = $value; } return $camelCaseAttributes; } }
步骤3:在控制器中使用资源类
use App\Http\Resources\UserResource; use App\Models\User; // ... $users = User::all(); return UserResource::collection($users);
2. 重写模型的toArray方法
如果只需要针对单个模型处理,可以直接在User模型中重写toArray方法:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Str; class User extends Model { // ... 其他模型代码 /** * 将模型转换为数组。 * * @return array */ public function toArray() { $rawAttributes = parent::toArray(); $camelCaseAttributes = []; foreach ($rawAttributes as $snakeKey => $value) { $camelCaseAttributes[Str::camel($snakeKey)] = $value; } return $camelCaseAttributes; } }
之后直接用原来的代码即可输出驼峰式JSON:
$user = User::all(); return response()->json($user);
3. 全局统一处理(基类模型)
如果需要所有模型都输出驼峰式属性,可以创建一个基类模型,让所有业务模型继承它:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Str; class BaseModel extends Model { public function toArray() { $rawAttributes = parent::toArray(); $camelCaseAttributes = []; foreach ($rawAttributes as $snakeKey => $value) { $camelCaseAttributes[Str::camel($snakeKey)] = $value; } return $camelCaseAttributes; } }
然后User模型继承BaseModel:
class User extends BaseModel { // ... 模型代码 }
补充说明
Str::camel()是Laravel内置的辅助函数,专门用于将蛇形命名转换为驼峰式命名,无需自己实现字符串转换逻辑。- 如果仅需要处理
created_at、updated_at这类时间字段,可以单独重写模型的serializeDate方法,但上述方案适用于所有属性的转换需求。
内容的提问来源于stack exchange,提问作者Anang M
相关产品推荐
相关产品推荐

