【问题标题】:Indirect Modification of Overloaded Property Laravel MongoDBLaravel MongoDB 重载属性的间接修改
【发布时间】:2015-12-25 22:48:55
【问题描述】:

我将 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"
  }
]

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

这是我的请求正文

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 的修改没有 效果

请帮我解决这个问题。

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

【问题讨论】:

  • 这里不限也不关mongodb,而是和eloquent和php有关

标签: php mongodb laravel laravel-5


【解决方案1】:

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

如果你想向 $category->specifics 数组添加一个新元素,你需要确保通过访问属性来使用魔法 __set()以二传手的方式,例如:

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

【讨论】:

    【解决方案2】:

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

    PHP

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

    这项工作是给我的!

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

          • 没有理由这样做。
          【解决方案6】:

          另一个简单的选择:

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

          例子:

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

          【讨论】:

            猜你喜欢
            • 2020-03-24
            • 1970-01-01
            • 2018-09-20
            • 1970-01-01
            • 2012-05-16
            • 1970-01-01
            • 2012-03-02
            • 2011-07-17
            • 1970-01-01
            相关资源
            最近更新 更多