Laravel save()正在更新错误的mysql记录

时间:2016-02-29 17:01:01

标签: php laravel

我有一个用户设置表,其中包含3列(或参见下面的图片):user_idsettingvalue

然后我有两个函数用于保存时区,另一个用于保存时间格式。

public function setTimezone($timezone){
    $settings = UserSettingsModel::firstOrNew(['user_id' => $this->user->id, 'setting' => 'timezone']);
    $settings->setting = 'timezone';
    $settings->value   = $timezone;
    $result = $settings->save();
}

public function setTimeFormat($timeformat){
    $settings = UserSettingsModel::firstOrNew(['user_id' => $this->user->id, 'setting' => 'timeformat']);
    $settings->setting = 'timeformat';
    $settings->value   = $timeformat;
    $result = $settings->save();
}

当我第一次运行这些函数时(每个函数都通过ajax调用独立运行)我得到的是正确的:

First Insert

然后当我尝试更新timeformat时,(每次都是独立运行)我得到了这个:

Updated

由于某些原因,timezone设置会覆盖timeformat设置,我不确定原因。

以下是 UserSettingsModel 类:

class UserSettingsModel extends BaseModel{
    protected $table      = 'user_settings';
    protected $fillable   = ['user_id', 'setting', 'value'];
    protected $primaryKey = 'user_id';
    public $timestamps    = false;
}

以下是时区更新的查询日志:

array:2 [
  0 => array:3 [
    "query" => "select * from `user_settings` where (`user_id` = ? and `setting` = ?) limit 1"
    "bindings" => array:2 [
      0 => 1
      1 => "timezone"
    ]
    "time" => 0.27
  ]
  1 => array:3 [
    "query" => "update `user_settings` set `value` = ? where `user_id` = ?"
    "bindings" => array:2 [
      0 => "America/Chicago"
      1 => 1
    ]
    "time" => 19.73
  ]
]

以下是 timeformat 查询的查询日志:

array:2 [
  0 => array:3 [
    "query" => "select * from `user_settings` where (`user_id` = ? and `setting` = ?) limit 1"
    "bindings" => array:2 [
      0 => 1
      1 => "timeformat"
    ]
    "time" => 0.25
  ]
  1 => array:3 [
    "query" => "update `user_settings` set `value` = ? where `user_id` = ?"
    "bindings" => array:2 [
      0 => "12hr"
      1 => 1
    ]
    "time" => 13.67
  ]
]

1 个答案:

答案 0 :(得分:2)

您有一个由user_idsettings组成的复合主键。

然后你的模型宣布

    protected $primaryKey = 'user_id';

您发布的查询日志清楚地显示SELECT语句是正确的,但UPDATE不是因为WHERE子句仅指定user_id的要求。

谷歌搜索(和其他人评论)Laravel似乎有复合键的问题。

如果找不到合适的解决方法,可以在表中添加id列(主键,int,自动增量)并更新模型定义。

然后让其他列成为标准列(如果需要,只需将它们编入索引)。

在添加新用户时,您会有一些额外的工作,因为我想您想为每个setting添加一行......