如何在Laravel上创建/编辑/更新/删除从json对象创建的集合

时间:2019-05-03 01:33:23

标签: json laravel

我有一个小的laravel项目正在收集中。我的字符串数据以json格式存储在customdata列中。下面是表中的值。

someid   somedata   customdata
1          aaa       [{"id": 1,"name":"new name","price": 20},{"id": 2,"name":"new name","price": 10}]

我可以从该列中获取数据并能够进行一些查询。让我们说如下假人。

$result = '[{"id": 1,"name":"new name","price": 20},{"id": 2,"name":"new name","price": 10}]';

$collection = collect(json_decode($result, true));

return $collection->where('id', 1)->first();

结果如下图所示。

{
    id: 1,
    name: "new name",
    price: 20
}

但是我不知道如何从集合中添加新的/更新/删除。例如,如果我添加更多数据(id = 3),那么它将是。

$result = '[
    {"id": 1,"name":"new name","price": 20},
    {"id": 2,"name":"new name","price": 10},
    {"id": 3,"name":"new name","price": 15},
]';

它仅用于模型,但我不知道原始集合。任何建议或指导将不胜感激,谢谢。

1 个答案:

答案 0 :(得分:1)

好,Collection类有很多有用的方法。您可以检查full list in the documentation

向集合中添加元素

要将元素添加到集合中,可以使用push()方法。从文档中:

  

push方法将一个项目附加到集合的末尾:

$collection = collect([1, 2, 3, 4]);

$collection->push(5);

$collection->all();

// [1, 2, 3, 4, 5]

在您的情况下:

// your actual collection
$result = /** here you get your json */;
$collection = collect(json_decode($result, true));
// the new element
$new = ['id' => 23, 'name' => 'the latest one!', 'price' => 1200];
//adding it to the collection
$collection->push($new);

更新集合中的元素

要执行此操作,您有几条路径。.我想到的一个方法是生成一个新集合,该集合映射与条件匹配的元素中的新值。 From the docs

  

map方法遍历集合并传递每个值   到给定的回调。回调可以自由修改项目和   返回它,从而形成一个新的修改项集合:

$collection = collect([1, 2, 3, 4, 5]);

$multiplied = $collection->map(function ($item, $key) {
    return $item * 2;
});

$multiplied->all();

// [2, 4, 6, 8, 10]

所以在您的情况下:

$result = /** here you get your json */;
$collection = collect(json_decode($result, true));

// parameters to search and update
$id = 1 // the element id to find
$data = ['the', 'data', 'to', 'update'];

// updating the collection
$collection = $collection->map(function ($element) use ($id, $data) {
    if ($element['id'])
        $element = $data; // here goes your update logic

    return $element;
});

删除集合元素

要删除集合元素,可以使用pull()方法。从文档中:

  

he pull方法从集合中删除并通过其返回一个项目   密钥:

$collection = collect(['product_id' => 'prod-100', 'name' => 'Desk']);

$collection->pull('name');

// 'Desk'

$collection->all();

// ['product_id' => 'prod-100']

因此,要删除数组的元素,我们将首先使用search()定位元素,该元素返回要删除的元素的键,然后使用前面提到的方法:pull()

$result = /** here you get your json */;
$collection = collect(json_decode($result, true));

// element to be deleted
$id = 1;

$key = $collection->search(function($element) use ($id) {
    return $element['id'] == $id;
});

$collection->pull($key);