0
votes

Conversion d'un seul champ en int (sans virgule) dans une réponse Laravel Json

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:

  1. Lancer d pour float , n'a pas fonctionné
  2. Casting 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 ?


0 commentaires

3 Réponses :


0
votes

essayez le casting de Laravel

https://laravel.com/docs/8.x/eloquent-mutators#attribute-casting

protected $casts = [
    'meter_id' => 'string',
     'd' => 'integer',
];


3 commentaires

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.



0
votes

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.


0 commentaires

2
votes

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.


1 commentaires

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!