间接修改重载属性Laravel MongoDB

时间:2015-12-25 22:48:55

标签: php mongodb laravel laravel-5

我在Laravel中使用MongoDB。我有一个名为categories的集合,其中有一个文档

[
  {
    "_id": "567dc4b4279871d0068b4568",
    "name": "Fashion",
    "images": "http://example.com/1.jpg",
    "specifics": [
      "made"
    ],
    "brands": [
      {
        "name": "Giordano",
        "logo": "http://example.com/"
      },
      {
        "name": "Armani",
        "logo": "http://example.com/"
      }
    ],
    "updated_at": "2015-12-25 22:40:44",
    "created_at": "2015-12-25 22:35:32"
  }
]

我正在尝试创建一个函数,在上面的文档中添加特定数组的细节。

以下是我的请求正文

HTTP: POST
{
    "specifics": [
        "material"
    ]
}

我正在使用以下功能处理此请求

/**
 * Add specs to category
 * @param string $category_id
 * @return Illuminate\Http\JsonResponse
 */
public function addSpecifics($category_id)
{
    $category = $this->category->findOrFail($category_id);
    $category->specifics[] = $this->request->get('specifics');
    $status_code = config('http.UPDATED');
    return response()->json($category->save(), $status_code);
}

但是当我点击这个电话时,我得到错误

  

CategoryController.php第101行中的ErrorException:间接   修改重载属性App \ Category :: $ specifics没有   效果

请帮我解决这个问题。

我正在使用compatibility table这个包用于MongoDB。

5 个答案:

答案 0 :(得分:21)

由于如何在Eloquent中实现访问模型属性,当您访问 $ category-> specifics 时,会调用一个魔术 __ get()方法来返回副本该属性的值。因此,当您向该副本添加元素时,您只需更改副本,而不是原始属性的值。这就是为什么你会收到一个错误,说不管你做了什么,它都不会产生任何影响。

如果您要向 $ category-> specifics 数组中添加新元素,则需要确保通过访问该元素来使用魔法 __ set()以setter方式的属性,例如:

$category->specifics = array_merge($category->specifics, $this->request->get('specifics'));

答案 1 :(得分:2)

将变量存储在临时变量中:

// Fatal error    
$foo = array_shift($this->someProperty);

// Works fine
$tmpArray = $this->someProperty;
$foo = array_shift($tmpArray);

答案 2 :(得分:1)

如果要将单个项目添加到数组中,可以使用此方法:

<强> PHP

$new_id = "1234567";
$object->array_ids = array_merge($object->array_ids, [$new_id]);

这项工作适合我!

答案 3 :(得分:0)

我在扩展Model的类中遇到了与数组相同的问题。

此代码$this->my_array[$pname]=$v;在我声明protected $my_array = [];之前不起作用

答案 4 :(得分:-1)

不要试图直接修改Eloquent集合,而是将集合转换为数组并使用该数组进行修改。

$model = Model::findOrFail($id);

$array = $model->toArray();
$array['key'] = $value;