Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel save()正在更新错误的mysql记录_Php_Laravel - Fatal编程技术网

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

Php Laravel save()正在更新错误的mysql记录,php,laravel,Php,Laravel,我有一个由3列组成的用户设置表(或见下图):user\u id,setting,value 然后我有两个功能,一个保存时区,一个保存时间格式 public function setTimezone($timezone){ $settings = UserSettingsModel::firstOrNew(['user_id' => $this->user->id, 'setting' => 'timezone']); $settings->setti

我有一个由3列组成的用户设置表(或见下图):
user\u id
setting
value

然后我有两个功能,一个保存时区,一个保存时间格式

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调用独立运行的),我得到了正确的结果:

然后,当我尝试更新
时间格式时(同样,每个都独立运行),我得到以下结果:

由于某种原因,
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
  ]
]
以下是时间格式查询的查询日志:

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
  ]
]

您有一个由
user\u id
settings
组成的复合主键

但是你的模型声明

    protected $primaryKey = 'user_id';
您发布的查询日志清楚地显示
SELECT
语句是正确的,但是
UPDATE
不是因为
WHERE
子句只指定了对
user\u id
的要求

谷歌搜索(以及其他人的评论)Laravel似乎在复合键方面存在问题

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

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


在添加新用户时,您将有一些额外的工作,因为我猜您希望为每个
设置添加一行,

而不是Laravel的专家。。。但是我会检查进行ajax调用的代码。它正在发送正确的数据,变量
$timezone
$timeformat
在转储中有正确的数据。laravel代码似乎没有任何问题。我看不出laravel代码有任何问题。如果你直接转到url,它能做你想做的吗?我不能,因为它是一个
PUT
类型添加自动递增的主键有效。然后,我将主复合键更改为唯一复合键。