2017-10-10 54 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));