我有一个小的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},
]';
它仅用于模型,但我不知道原始集合。任何建议或指导将不胜感激,谢谢。
答案 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);