2015-12-25 7 views
9

Ich verwende MongoDB mit Laravel. Ich habe eine Sammlung namens categories, die ein Dokument hatIndirekte Änderung der überladenen Eigenschaft Laravel MongoDB

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

Ich versuche, eine Funktion zu machen, die Besonderheiten auf die Besonderheiten Array in dem obigen Dokument hinzuzufügen.

Hier ist, wie meine Anfrage Körper

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

ist, und ich bin Umgang mit diesem Antrag mit der folgenden Funktion

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

Aber wenn ich diesen Anruf getroffen, erhalte ich Fehler von

ErrorException in CategoryController.php Zeile 101: Indirekte Änderung der überladenen Eigenschaft App \ Category ry :: $ specificals hat keine Wirkung

Bitte helfen Sie mir bei der Beseitigung dieser.

Ich verwende https://github.com/jenssegers/laravel-mongodb dieses Paket für MongoDB.

Antwort

14

Aufgrund wie Modell Zugriff auf Attribute in Eloquent implementiert wird, wenn Sie Kategorie- $> Besonderheiten zugreifen, eine magische __get() Methode aufgerufen wird, das eine Kopie dieses Attributs Wert zurückgibt. Wenn Sie dieser Kopie ein Element hinzufügen, ändern Sie daher nur die Kopie und nicht den Wert des ursprünglichen Attributs. Deshalb erhalten Sie eine Fehlermeldung, dass alles, was Sie gerade tun, keine Auswirkungen hat.

Wenn Sie ein neues Element $ category-> Besonderheiten Array hinzufügen möchten, müssen Sie sicherstellen, dass die Magie __set() durch den Zugriff auf das Attribut in einem Einrichter Weise verwendet wird, zB:

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

Sie diese Methode in Fall verwenden können, die Sie ein einzelnes Element zu dem Array hinzufügen möchten:

PHP:

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

Diese Arbeit ist für mich!

1

Speichern Sie Ihre Variable in einem temporären Array:

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

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