Как создать / отредактировать / обновить / удалить коллекцию, созданную из объекта json в Laravel - PullRequest
0 голосов
/ 03 мая 2019

У меня есть небольшой проект 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 Ответ

1 голос
/ 03 мая 2019

Ну, у класса Collection есть много полезных методов для игры. Вы можете проверить полный список в документации .

Добавление элемента в коллекцию

Чтобы добавить элемент в свою коллекцию, вы можете использовать метод 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);

Обновление элемента коллекции

Для этого у вас есть несколько путей ... один, который приходит мне в голову, - это создать новую коллекцию, отображающую новые значения в элементе, который соответствует вашему условию. Из документов :

Метод 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(). Из документов:

метод 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...