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 AppHttpResources;
use IlluminateHttpResourcesJsonJsonResource;
class KeyValueResource extends JsonResource
{
public $preserveKeys = true; // [tl! focus]
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 AppHttpControllers;
use AppModelsSetting;
use AppHttpResourcesSettingResource;
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.
The post Preserving Collection Keys in Laravel API Resources appeared first on Laravel News.
Join the Laravel Newsletter to get all the latest
Laravel articles like this directly in your inbox.
Source: Read MoreÂ