间接修改重载属性Laravel MongoDB


Indirect Modification of Overloaded Property Laravel MongoDB

我正在使用带有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::$specific没有影响

请帮我解决这个问题。

我正在使用https://github.com/jenssegers/laravel-mongodb此包适用于MongoDB。

由于访问模型属性在Eloquent中是如何实现的,当您访问$category->specific时,会调用一个神奇的__get()方法,返回该属性值的副本。因此,当您向副本中添加元素时,您只是在更改副本,而不是原始属性的值。这就是为什么你会得到一个错误,说无论你在做什么,都不会有任何影响。

如果您想将新元素添加到$category->specific数组中,您需要确保通过以setter方式访问属性来使用魔术__set(),例如:

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

如果您想向数组中添加单个项,可以使用此方法:

PHP

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

这是给我的!

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

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

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

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

另一个简单的替代方案:

function array_push_overloaded($source, $element) {
  $source[] = $element;
  return $source;
}

示例:

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

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

$model = Model::findOrFail($id);
$array = $model->toArray();
$array['key'] = $value;