Laravel Eloquent模型save()不会更新数据库

时间:2018-04-06 05:18:38

标签: laravel-5 eloquent php-7

我开始说是的,我看过这个,不,没有其他人的修复似乎对我有用......

所以我有一个player模型,我想更新特定字段。我提交了一个ajax请求,并让它更新相关字段。

此模型使用自定义主键。

玩家模型

class Player extends Model
{
    // Settings
    protected $primaryKey = 'playerid';
    protected $connection = 'mysql_game';
    protected $table = "players";

    public $timestamps = false;

    // Various casting and accessor/mutator stuff
    // Various relationships
}

该表格如下: https://puu.sh/zXh3Y/dd75b2e0d9.png 加上“访问”#39;字段TEXT

现在......在我的控制器中(是的,我在控制器atm中获得了逻辑,我将在以后提取它)...它是一个补丁路由,它接受一个动作作为请求之一投入。它会切换这些输入,然后根据提供的操作更新相关部分。

无论如何......这里的问题仅适用于其中一项行动。其他人都没有这个问题,即使保存代码本身是相同的。在切换任何操作之前,播放器会在控制器的开头被抓取,因此播放器对象对于工作和不工作的开关都是相同的。

控制器(仅限部分)

public function update(Request $request)
{
    $output = [
        'status' => 'failure',
        'message' => 'Nothing happened',
        'data' => null
    ];

    if (!$request->has(['id','action','data'])){
        $output['message'] = "Missing input parameters!";
        return $output;
    }

    $data= $request->get('data');
    $id= $request->get('id');

    $player = Player::find($player);
    if (is_null($player)){
        $output['message'] = "Could not find player";
        return $output;
    }

    switch($request->get('action')){
        // various switch actions in here
    }

$player->access数组的布局是: [ ['keyname',0], ['keyname2',0], ['keyname3',1], ... ] 基本上是一个数组数组,每个子数组包含值名称和1/0(真/假)值。在访问时,Player模型将其转换为数组。

case "faction.access": {
            $access= $player->access;
            $key = null;
            foreach ($access as $i=>$item){
                if ($item[0] === $data){
                    $key = $i;
                }
            }

            $newValue = 0;
            if ($access[$key][1] === 0){
                $newValue = 1;
            }

            $log = new LogCreator();
            $log->setTarget($player->playerid)->setAction('access-'.$value)->setOld($access[$key][1])->setNew($newValue)->save();

            $access[$key][1] = $newValue;
            $player->access = $access;

            try {
                $player->save();
                $this->breakPlayerCache($player->playerid);
                $output['status'] = 'success';
                $output['data'] = $access;
            } catch (\Exception $e){
                $output['message'] = 'An error occurred when saving.';
            }
            break;
        }

现在,我获得了成功'我的前端上的消息,以及传回的数据是正确的...但是,当我检查数据库时,没有保存任何内容。当我使用Barryvdh的Debugbar输出值时,我还可以看到$ access变量已经正确更新,但是$ player对象实际上没有保存这些值。

我已经在artisan tinker尝试了同样的结果。 save()返回true。

我在网上发现的其他大多数事情都是关于要么没有指定自定义主键(我已经完成),要么是大写/小写问题(我的所有东西都是小写的)。所以我完全难过......任何帮助都会非常感激。

(在Laracasts上转发:https://laracasts.com/discuss/channels/eloquent/save-returns-true-yet-does-not-update

1 个答案:

答案 0 :(得分:0)

我认为问题可能出在您的模型上。

您可能需要声明protected $fillable数组:

示例:

/**
 * The attributes that are mass assignable.
 *
 * @var array
 */
protected $fillable = [
    ...
    'access'
    ...
];

https://laravel.com/docs/5.6/eloquent#mass-assignment