web-dev-qa-db-ja.com

オーバーロードされたプロパティの間接的な変更Laravel MongoDB

LaravelでMongoDBを使用しています。 1つのドキュメントを持つ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の間接的な変更は効果がありません

これを修正するのを手伝ってください。

https://github.com/jenssegers/laravel-mongodb MongoDB用のこのパッケージを使用しています。

14
Raheel

モデル属性へのアクセスがEloquentでどのように実装されているため、$ category-> specificsにアクセスすると、その属性の値のコピーを返すマジック__ get()メソッドが呼び出されます。したがって、そのコピーに要素を追加する場合、元の属性の値ではなく、コピーを変更するだけです。そのため、何をしていても効果がないというエラーが表示されます。

新しい要素を$ category-> specifics配列に追加する場合は、セッターの属性にアクセスして、マジック__ set()が使用されていることを確認する必要がありますマナー、例えば:

$category->specifics = array_merge($category->specifics, $this->request->get('specifics'));
26
jedrzej.kurylo

変数を一時変数に保存します。

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

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

配列に単一の項目を追加する場合にこのメソッドを使用できます。

[〜#〜] php [〜#〜]

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

この作品は私のためです!

Eloquentコレクションを直接変更しようとせず、代わりにコレクションを配列にキャストし、その配列を変更に使用します。

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

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