J'envoie une demande de publication en utilisant le facteur à mon API Laravel.

{
    "title" : "abc",
    "body" : [
        {"type":"paragraph","data":{"text":"aSADAd"}},
        {"type":"header","data":{"text":"Heading......","level":2}},
        {"type":"paragraph","data":{"text":"This is a para"}},
        {"type":"list","data":{"style":"ordered","items":["ABC","XYZ"]}}
    ],
    "status" : 1
}

Le champ body est un champ de données JSON - la sortie JSON.stringify de l'éditeur js.

Mes règles de validation laravel sont -

$validator = Validator::make($request->all(), [
            'title' => 'required|string|max:255',
            'body' => 'required|json',
            'status' => 'required|boolean'
        ]);

Mais je reçois cette erreur -

{
    "validation_error": {
        "body": [
            "The body must be a valid JSON string."
        ]
    }
}
1
Debarshi Das 9 nov. 2020 à 09:18

1 réponse

Meilleure réponse

Essayez array

$validator = Validator::make($request->all(), [
    'title' => 'required|string|max:255',
    'body' => 'required|array',
    'status' => 'required|boolean'
]);

Cela fonctionnera si vous définissez votre modèle

/**
 * The attributes that has json type.
 *
 * @var array
 */
protected $casts = [
    'body' => 'array'
];

Comme ça, vous pouvez travailler avec json mysql dans laravel

REMARQUE : le type de distribution de tableau est particulièrement utile lorsque vous travaillez avec des colonnes stockées en tant que JSON sérialisé. Par exemple, si votre base de données a un type de champ JSON ou TEXT qui contient du JSON sérialisé, l'ajout du transtypage du tableau à cet attribut désérialisera automatiquement l'attribut en un tableau PHP lorsque vous y accéderez sur votre modèle Eloquent :

Liens de référence

https://laravel.com/docs/8.x/eloquent-mutators#array-and-json-casting

https://laraveldaily.com/working-with-mysql-json-columns-in-laravel-custom-properties-example/

https://laracasts.com/discuss/channels/laravel/saving-an-array-into-a-json-column-in-a-mysql-database

1
Kamlesh Paul 9 nov. 2020 à 06:33