【问题标题】:How to append unique ID to a json array - OctoberCMS / Laravel如何将唯一 ID 附加到 json 数组 - OctoberCMS / Laravel
【发布时间】:2019-06-08 00:12:11
【问题描述】:

OctoberCMS BackendForm-Widget "Repeater" 将我的数据作为数组存储在数据库中,如下所示:

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

我需要为每个数组添加一个唯一的 ID,以便 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

有没有人遇到过这种情况并找到了他/她可以分享的解决方案?

【问题讨论】:

  • 每个主题都有一个(唯一的)键。所以你可以把这个键复制为附加值
  • 参数 1 应该是您作为第二个参数提供的回调。

标签: php mysql arrays laravel octobercms


【解决方案1】:

LukeTower 鼓掌,他在Github 上为我指明了正确的方向。

解决方案是将逻辑放在模型的 beforeSave() 方法中:

公共函数 beforeSave() { $this->_FieldName_ = array_map(function ($miau) { $miau['id'] = uniqid(); 返回$miau; }, $this->_FieldName_); }

【讨论】:

    【解决方案2】:

    根据文档的第一个参数应该是回调,将您的代码替换为以下代码并尝试它是否有效。

    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

    【讨论】:

    • 嗯...看起来不错,但不幸的是没有任何效果。但至少没有任何错误。 ;-)
    • 对我来说它工作正常。你能展示你的尝试吗?
    • 除了将您的 sn-p 添加到我的控制器中之外,没有更改上述初始代码的任何内容:``` public function formBeforeSave($model) { $model->topics = array_map(function ($ topic) { $topic['id'] = uniqid(); return $topic; }, $model->topics); } ``` 但是 json 数组看起来一样,并没有改变。之后出于测试目的,我删除了数据库中的列。我认识到第一次尝试保存时会抛出错误:
    • array_map(): Argument #2 should be an array 我猜它这样做是因为它找不到数组。然后我注释掉了你的 sn-p,通过保存 OctoberCMS BackendForm 存储了一个数组。一旦我在列中有一个新数组,我就重新激活了您的 sn-p...但是 ... :-( ...没有好消息。没有附加 id。我将列更改为 json 并返回到 Text . 既没有也没有帮助。
    • 你能显示var_dump($model->topics);的输出吗?
    【解决方案3】:

    每个主题已经有一个(唯一的)键。因此,您可以在遍历数组时将此键复制为附加值:

    // mocking test-data:
    // $model->topics = [["topic"=>"title"], ["bar"=>"foo"]];
    
    array_walk($model->topics, function(&$topic, $key) {
        $topic['topic_id'] = $key;
    });
    

    【讨论】:

    • 谢谢杰夫!不幸的是,这并没有奏效。我收到错误:"Indirect modification of overloaded property Class::$topics has no effect"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 2018-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多