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; // [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 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.
The post Preserving Collection Keys in Laravel API Resources appeared first on Laravel News.
Join the Laravel Newsletter to get Laravel articles like this directly in your inbox.