2017-09-09 5 views
1

Beschreibung: ich ein Spiel erschaffe, wo Sie Ihre Gebäude aktualisieren. Nachdem Sie auf ein Gebäude geklickt haben, wird es durch die upgradeBuilding() -Methode auf eine höhere Ebene gehoben. Der problematischste Teil ist, dass ich ein Gebäude aktualisieren muss, das in $building variabel sein wird, es ist immer eine Zeichenfolge mit dem Namen des Gebäudes. Ich denke, dass der $currentBuildingLevel->{$building} den Fehler verursacht. Das zweite Problem ist, dass wenn ich versuche var_dump($currentBuildingLevel) seine Lade verrückt lange, es ist nicht nur ein einfaches Objekt mit Ebenen der Gebäude ...Laravel5 ORM-Update - undefined Eigentum von Variable

Datenbank: In Datenbank buildings Tabelle, die Werte wie folgt aussehen: enter image description here

Gebäudemodell: Hier ist der Code, der eine Gebäudeebene in oben Datensatz aktualisieren soll:

$building = "barracks" // example building 

public function upgradeBuilding($building) 
{ 
    $currentBuildingLevel = $this->first()->where("user_id", "=", Auth::id());  
    $currentBuildingLevel->{$building} = $currentBuildingLevel->{$building} + 1; 
    $currentBuildingLevel->save(); 
} 

Fehler: ich eine Störung erhalte:

Undefined property: Illuminate\Database\Eloquent\Builder::$barracks 

Frage: Wie mache ich das richtig? Ist $currentBuildingLevel bereits ein Objekt eines Modells?

+1

move 'first()' in das Ende der Abfrage '$ this-> where ("user_id", "=", Auth :: id()) -> first(); ' –

+0

@RavishaHesh Vielen Dank für Ihren Rat, macht es einen Unterschied? – divHelper11

+1

yup, '$ this-> first()' gibt Ihnen eine Instanz Ihres Modells, Sie können also 'where()' nicht verwenden, 'where()' Funktion ist Teil von "Illuminate/Database/Eloquent/Builder "Klasse. –

Antwort

2

Sie versuchen, auf eine Eigenschaft auf Builder anstelle von Ihrem tatsächlichen Modell zuzugreifen, da Sie Ihre Abfrage nie abschließen (mit first()).

Sie können dies durch 3 Optionen lösen.

Ihre first() Aufruf an das Ende verschieben:

$currentBuildingLevel = $this->where("user_id", "=", Auth::id())->first(); 

Oder die Instanz verwenden Sie arbeitet bereits an:

$this->{$building} += 1; 
$this->save(); 

Oder update your column in Ihrem Controller mit einer SQL-Abfrage, ohne das Abrufen von Daten zuerst:

Building::where('user_id', Auth::id())->increment($building); 
+0

Ich werde das überprüfen, sobald ich nach Hause komme. Danke für deine Antwort, mit der ich seit gestern stritt: P – divHelper11

Verwandte Themen