web-dev-qa-db-fra.com

Modification indirecte d'une propriété surchargée Laravel MongoDB

J'utilise MongoDB avec Laravel. J'ai une collection appelée categories qui a un document 

[
  {
    "_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"
  }
]

J'essaye de faire une fonction qui ajoute des détails au tableau de spécificités dans le document ci-dessus.

Voici comment mon corps de demande est

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

Et je traite cette demande avec la fonction suivante

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

Mais quand je frappe cet appel, je reçois une erreur de 

ErrorException dans la ligne CategoryController.php 101: Indirect modification de la propriété surchargée App\Category :: $ Specifics n'a pas de effet

S'il vous plaît aidez-moi à résoudre ce problème.

J'utilise https://github.com/jenssegers/laravel-mongodb ce paquet pour MongoDB.

13
Raheel Khan

En raison de la manière dont l'accès aux attributs de modèle est implémenté dans Eloquent, lorsque vous accédez à $ category-> spécificités , une méthode magique __get () est appelée et renvoie une copie de la valeur de cet attribut. Par conséquent, lorsque vous ajoutez un élément à cette copie, vous ne faites que modifier la copie, pas la valeur de l'attribut d'origine. C'est pourquoi vous obtenez une erreur en disant que quoi que vous fassiez, cela n'aura aucun effet.

Si vous souhaitez ajouter un nouvel élément à $ category-> spécificités tableau, vous devez vous assurer que la magie __set () est utilisée en accédant à l'attribut de manière définie, par exemple:

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

Stockez votre variable dans une variable temporaire:

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

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

Vous pouvez utiliser cette méthode si vous souhaitez ajouter un seul élément au tableau:

PHP:

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

Ce travail est pour moi!

1

N'essayez pas de modifier directement une collection Eloquent, mais préférez la convertir en tableau et utilisez ce tableau pour vos modifications.

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

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