当前位置: 首页 > 知识库问答 >
问题:

laravel保存()更新错误的mysql记录

龚永新
2023-03-14

我有一个由3列组成的用户设置表(或见下图):user\u 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调用独立运行的),我得到了正确的结果:

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

由于某种原因,时区设置覆盖了时间格式设置,我不确定为什么。

以下是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个答案

刘星火
2023-03-14

您有一个由user_id设置组成的复合主键。

但是你的模型宣称

    protected $primaryKey = 'user_id';

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

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

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

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

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

 类似资料:
  • 我正在尝试使用具有唯一约束“phone\u number\u key”的jooq和table实现save或update方法 我的代码: 但我得到了例外 错误:重复的键值违反唯一约束“phone_number_key”详细信息:key(“phoneNumber”)=(99999999)已存在。 我使用“.onDuplicateKeyUpdate()”方法时遇到了相同的错误 我使用postgres d

  • 已安装的laravel模板构建在版本4.2上,当我制作composer(安装/更新)时,composer仍然存在此错误。 问题1 -d11wtq/boris v1.0.10的安装请求-

  • 如果值不改变,我想忽略段塞。我目前得到这个错误,每当我更新的形式。 这是我的验证请求。 命名空间App\Http\Requests\Admin; 使用Illumb\Foundation\Http\FormRequest; 类ProductInsertFormRequest扩展FormRequest{/***确定用户是否有权发出此请求。**@return bool*/public function

  • 我试图更新作曲家,但得到错误 以下是错误日志的链接:https://pastebin.com/JNT7Wi15 Laravel版本:5.4 Php版本:PHP7.2。4-1乌本图16。04.1黛布。苏里。org 1(cli)(构建时间:2018年4月5日08:53:57)(NTS)版权所有(c)1997-2018 PHP Group Zend Engine v3。2.0,版权所有(c)1998-2

  • 我正在尝试在Laravel中复制个人资料页。这一切都很好,但当我点击“保存”以保存配置文件中的更改时,它显示的就像我一样 没有争论。此消息Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException无消息。 由于某些原因,我无法从文件中导入代码,没有代码的人能帮忙吗?

  • 我想使用MySQL5.7和MySQL Workbench6.2在表中插入一些行。当我尝试它时,我得到了错误1175(在安全更新模式下没有WHERE的更新)