2017-10-10 53 views
1

任何人都可以建議我將json解碼對象以乾淨的方式映射到pdo語句中的好習慣嗎?映射未定義的json屬性

我創建了一個API(使用slimslim-pdo)從不同的客戶端應用程序請求的CRUD操作。有些桌子很大,有幾個可空的柱子。 這意味着對於大多數情況下,發佈的json將不會包含所有列數據。

爲例:

$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'))); 
從客戶端這樣的事情在發帖時

...

{ 「託」: 「富」, 「PROP2」: 「酒吧」}

.. .PHP記錄這樣的警告:

PHP公告:未定義的屬性:stdClass的:: $ prop3在/ home/...上線...

由於prop3在json中不存在。

我知道這可以通過使用php property_exists()和/或isset()來避免。 但是,在數十個操作代碼的所有語句中爲所有屬性執行此操作將變得非常龐雜。

我已經爲此找到了一個乾淨的解決方案。 最初通過搜索未定義屬性的方式作爲null。 然後搜索對象映射方法。

有什麼建議嗎?

非常感謝! :)

+1

如果使用PHP 7,您可以使用空凝聚運營商??,所以'$用品 - > prop3 ?? null'將其值設置爲空如果不在那裏。 –

回答

0

我會做這樣的

$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));