Как добавить уникальный идентификатор в массив json - OctoberCMS / Laravel - PullRequest
0 голосов
/ 14 января 2019

OctoberCMS BackendForm-Widget «Repeater» хранит мои данные в виде массива в базе данных, которая выглядит так:

    {
    "topic":"title",
    "topic_description":"description",
    }
    {
    "topic":"title",
    "topic_description":"description",
    }

Мне нужно добавить уникальный идентификатор в каждый массив, чтобы json выглядел следующим образом:

    {   
    "topic_id":"1",
    "topic":"title",
    "topic_description":"description",
    }  
    {   
    "topic_id":"2",
    "topic":"title",
    "topic_description":"description",
    }

Я добавил эту функцию formBeforeSave в свой контроллер:

public function formBeforeSave($model)
    {

        $model->topics = array_map(array($model, 'topics'), function ($topic) {
         $topic['id'] = uniqid();
        });
    }

Но при попытке сохранить форму OctoberCMS выдает эту ошибку:

“array_map(): Argument #2 should be an array”

Вместо этого добавьте это в контроллер:

public function formBeforeSave($model)
{
    $model->topics = array_map($model->topics, function ($topic) {
         $topic['id'] = uniqid();
    });
}

Выдает ошибку:

array_map() expects parameter 1 to be a valid callback, array must have exactly two members

Кто-нибудь испытал это и нашел решение, которым он / она может поделиться, пожалуйста?

Ответы [ 3 ]

0 голосов
/ 14 января 2019

В соответствии с первым аргументом docs должен быть обратный вызов, замените ваш код на следующий и попробуйте, если он работает.

public function formBeforeSave($model)
{
    $model->topics = array_map(function ($topic) {
         $topic['id'] = uniqid();
         return $topic;
    }, $model->topics);
}

Ссылка: http://php.net/manual/en/function.array-map.php

0 голосов
/ 15 января 2019

Аплодисменты отправляются на LukeTower , который указал мне правильное направление на Github .

Решение заключается в размещении логики в методе beforeSave () на модели:


    public function beforeSave()
{
    $this->_FieldName_ = array_map(function ($miau) {

        $miau['id'] = uniqid();
        return $miau;

    }, $this->_FieldName_);
}

0 голосов
/ 14 января 2019

В каждой теме уже есть (уникальный) ключ. Таким образом, вы можете просто скопировать этот ключ в качестве дополнительного значения при обходе массива:

// mocking test-data:
// $model->topics = [["topic"=>"title"], ["bar"=>"foo"]];

array_walk($model->topics, function(&$topic, $key) {
    $topic['topic_id'] = $key;
});
...