When building APIs, Laravel reindexes resource collections numerically by default. For cases where original keys carry meaning, preserveKeys property maintains the intended data structure.
<?php namespace App\Http\Resources; use Illuminate\Http\Resources\Json\JsonResource; class KeyValueResource extends JsonResource{ public $preserveKeys = true; public function toArray($request) { return [ 'value' => $this->value, 'updated_at' => $this->updated_at, 'metadata' => $this->metadata ]; }}
Here is an example on how this might look in your Laravel applications.
<?php namespace App\Http\Controllers; use App\Models\Setting;use App\Http\Resources\SettingResource; class SettingController extends Controller{ public function index() { $settings = Setting::all()->keyBy('key'); return SettingResource::collection($settings); }} class SettingResource extends JsonResource{ public $preserveKeys = true; public function toArray($request) { return [ 'value' => $this->formatValue(), 'type' => $this->type, 'last_updated' => $this->updated_at->toDateTimeString(), 'editable' => $this->is_editable ]; }}
Then, it would give you a response like this:
{ "data": { "app_name": { "value": "My Application", "type": "string", "last_updated": "2024-03-15 10:30:00", "editable": true }, "max_upload_size": { "value": 10485760, "type": "integer", "last_updated": "2024-03-15 10:30:00", "editable": true } }}
The preserveKeys property ensures meaningful keys are maintained in your API responses, particularly valuable for configuration data and key-value structures.