Laravel5 ORM更新 - 来自变量

时间:2017-09-09 16:47:41

标签: php laravel laravel-5 eloquent

说明 我正在创建一个游戏,您可以在其中升级您的建筑物。点击任何建筑物后,它将通过upgradeBuilding()方法升级到更高级别。最有问题的部分是我必须升级将在$building变量中的建筑物,它始终是一个带有建筑物名称的字符串。我认为$currentBuildingLevel->{$building}导致错误。第二个问题是,每当我尝试var_dump($currentBuildingLevel)它的装载时间很长,它不仅仅是一个具有建筑物等级的简单物体......

数据库: 在数据库buildings表中,级别如下所示: enter image description here

构建模型: 以下是应更新上述记录中的建筑物级别的代码:

$building = "barracks"  // example building

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

错误: 我收到错误:

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

问题: 如何正确执行此操作? $currentBuildingLevel已成为模型的对象吗?

1 个答案:

答案 0 :(得分:2)

您尝试访问Builder上的媒体资源而非实际模型,因为您永远不会完成查询(使用first())。

您可以通过3个选项解决此问题。

first()电话移至结尾处:

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

或者使用您正在处理的实例:

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

或者update your column在控制器中使用sql查询而不首先获取数据:

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