基于JSON查询结果在数据库中新增记录

一个典型的场景,就是通过API抓取了关于一个产品的一大串数据,都是JSON格式,我们要取出其中的部分字段,新增一条记录。

获取JSON数据以后,第一步要将JSON数据解析为对象,有两种模式,一种是Class,一种是数组。

如果走Class的路线,那么最后的代码就是这样子,可以想象,如果要关联的字段很多,这段代码还是非常繁琐的。

$product = Product::firstOrCreate([
    "Sku" => $item->Sku,
    "FriendlyUrl" => $item->FriendlyUrl
]);

如果在json_decode第二个参数传入true,就可以返回一个数组,那么最后的创建命令就会非常简洁:

$item = array_only($item, ['Sku', 'FriendlyUrl']);
$product = Product::firstOrCreate($item);

综合起来看,还是建议将json_decode返回为数组模式。

将PHP数组所有的Key,都从驼峰形式转变成下划线形式

比如有这样一个数组:

[
    "Sku" => "A1B2C3D4",
    "FriendlyUrl" => "http://example.com/1.html"
]

希望能够转化为下面这个形式的数组:

[
    "sku" => "A1B2C3D4",
    "friendly_url" => "http://example.com/1.html"
]

这里借助Laravel的Collection对象和snake_case这个helper函数,可以很方便实现这个效果

function array_snake_case_keys(array $items): array {
    $items = collect($items);
    return $items->keys()->map(function($key) {
        return snake_case($key);
    })->combine($items->values())->all();
}

btw,这个函数已经封装到了 cuimingda/laravel-helpers 中,只要引入进来就可以直接像其他helper函数一样使用:

composer require cuimingda/laravel-helpers

还有需要说明的是,snake_case这个函数有个bug,如果是imgURL这种大写字母组成的字符串,期望转化成img_url,但实际会转化为img_u_r_l,在laravel/framework中提了一个Issue,但被认为没有问题。