Je vous renvoie un modèle éloquent:
{ "t": "2020-10-01T00:00:00Z", "meter_id": "30002", "operation_id": "ACC000000", "conso_prod": "Conso", "d": 14, "s": "Pamela", "timestep": 600000000000, "unit": "kW" },
Ce que je veux, c'est d
être un flotteur, donc, sans ""
:
return Response::json($raws, 200, [], JSON_NUMERIC_CHECK);
Alors, j'ai utilisé:
{ "t": "2020-10-01T00:00:00Z", "meter_id": "30002", "operation_id": "ACC000000", "conso_prod": "Conso", "d": "14", "s": "Pamela", "timestep": 600000000000, "unit": "kW" },
Ce qui fonctionnait très bien fo d
champ.
Mais maintenant, j'ai le champ meter_id qui est devenu un entier, et celui-ci, je le veux sous forme de chaîne:
Résultat final dont j'aurais besoin:
{ "t": "2020-10-01T00:00:00Z", "meter_id": "30002", "operation_id": "ACC000000", "conso_prod": "Conso", "d": "14", "s": "Pamela", "timestep": 600000000000, "unit": "kW" },
J'ai également essayé de lancer des champs dans le modèle:
d
pour float
, n'a pas fonctionnémeter_id
en string
, n'a pas fonctionné non plus Si possible, je voudrais éviter d'utiliser ->map()
sur result pour convertir manuellement les champs, car ma collection peut être assez grande.
Que dois-je faire à ce sujet ?
3 Réponses :
essayez le casting de Laravel
https://laravel.com/docs/8.x/eloquent-mutators#attribute-casting
protected $casts = [ 'meter_id' => 'string', 'd' => 'integer', ];
c'est ce que je voulais dire quand j'écris: -> Casting meter_id en string, ne fonctionnait pas non plus. Déjà essayé et ne fonctionne pas
supprimer toutes les modifications par carte ou boucle ne garder que le casting du modèle, puis cela fonctionnera supprimer JSON_NUMERIC_CHECK
cela aussi
Je ne fais aucune carte pour l'instant, et supprime également JSON_NUMERIC_CHECK
, il ne le prend pas. C'est pourquoi je poste.
Je suggère d'utiliser la fonction php intval () .
De l'autre côté, je pense que vous devriez envisager d'utiliser la fonction de collecte de cartes pour manipuler votre tableau.
Je suggère de convertir tout l'objet dans un JsonResource
personnalisé. De cette façon, vous avez un contrôle complet sur ce qui est produit, comment il est transformé et à quel point il sera cohérent lorsque vous modifiez quelque chose dans le modèle:
La ressource Eloquent:
AResource::collection($raws);
Pour transformer un modèle unique, utilisez
new AResource($raws);
et pour transformer une utilisation de collection éloquente
use Illuminate\Http\Resources\Json\JsonResource; class AResource extends JsonResource { public function toArray($request) { return [ 't' => $this->t, 'meter_id' => (string) $this->meter_id, 'operation_id' => $this->operation_id, 'conso_prod' => $this->conso_prod, 'd' => (int) $this->d, 's' => $this->s, 'timestep' => (float) $this->timestep, 'unit' => $this->unit, ]; } }
Vous pouvez directement renvoyer la ressource depuis le contrôleur, cela servira de réponse.
Oui, cela peut être une option. Je pense que pour mon cas d'utilisation, je préférerai une fonction map (), car je n'ai besoin d'écrire que les champs dont j'ai besoin pour lancer et non tous les champs. Mais il est bon d'extraire la transformation du contrôleur, je vais devoir réfléchir à ce qui est le mieux!