超载属性的间接修改 Laravel MongoDB

2022-08-30 14:48:04

我正在将MongoDB与Laravel一起使用。我有一个名为的集合,其中包含一个文档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"
  }
]

我正在尝试创建一个函数,将细节添加到上述文档中的 specifics 数组中。

这是我的请求正文

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);
}

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

错误类别控制器中的异常.php行 101:间接修改重载属性 App\类别::$specifics不起作用

请帮我解决这个问题。

我正在使用 https://github.com/jenssegers/laravel-mongodb MongoDB的这个软件包。


答案 1

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

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

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

答案 2

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

菲律宾比索

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

这项工作适合我!


推荐