2017-10-10 6 views
1

Quelqu'un peut-il me suggérer une bonne pratique pour mapper les objets décodés json dans les instructions pdo de manière propre?Mappage des propriétés json non définies

J'ai créé une API (en utilisant slim et slim-pdo) pour des opérations crud demandées à partir de différentes applications client. Certaines tables sont assez grandes avec plusieurs colonnes nullables. Cela signifie que dans la plupart des cas, le fichier json affiché ne sera pas complet avec toutes les données de colonne.

Exemple:

$item= json_decode($req->getBody()); 
    $insertStatement = $pdo->insert(array('prop1', 'prop2', 'prop3',..., 'prop10')) 
          ->into('table') 
          ->values(array($item->prop1, $item->prop2, $item->prop3,..., 'server side value 10'))); 

lors de la publication de quelque chose comme client ... ce

{ "prop": "foo", "PROP2": "bar"}

.. .php enregistre un avertissement comme celui-ci:

PHP Notice: Undefined property: stdClass :: prop3 de $ dans/home/... en ligne ...

Comme prop3 n'est pas présent dans json. Je sais que cela peut être évité en utilisant php property_exists() et/ou isset(). Cependant, le faire pour toutes les propriétés dans toutes les déclarations de douzaines de codes d'opérations deviendra énorme et salissant.

J'ai cherché sur Google une solution propre pour cela. Initialement en recherchant un chemin de propriétés indéfinies agissent comme nul. Puis recherche de l'approche de mappage d'objet.

Une suggestion?

Merci beaucoup! :)

+1

Si vous utilisez PHP 7, vous pouvez utiliser l'opérateur nul Coalesce ??, donc 'item- $> prop3 ?? null' va définir la valeur null sinon là. –

Répondre

0

je le ferais comme ça

$json = '{"prob": "foo", "prop2": "bar"}'; 
$jsonArray = json_decode($json, true);// this will decode json in array 
// $jsonArray will be: ["prop" => "foo", "prop2" => "bar"] 
// array_keys will be: ["prop", "prop2"] 
// array_values wil be: ["foo", "bar"]; 

$insertStatement = $pdo->insert(array_keys($jsonArray)) 
          ->into('table') 
          ->values(array_values($jsonArray));