【问题标题】:Failed DB update requests with Laravel使用 Laravel 失败的数据库更新请求
【发布时间】:2021-02-03 05:51:15
【问题描述】:

在花了很多时间在网上搜索答案之后,我完全被 Laravel 的一个看似简单的数据库更新所困。这是我的一个控制器中存在缺陷的功能的(简化)版本:

public function changeDetails(Request $request)
    {

      ...

      // It works to change member_id into another...
      if (Request::input('recipient_id') != "null") {
        DB::table('recipients')
          ->where('recipients.id','=',Request::input('recipient_id'))
          ->update([
            'recipients.member_id' => Request::input('member_id')
          ]);
      // ...but it won't let me change it to NULL.
      } else {
        DB::table('recipients')
          ->where('recipients.id','=',Request::input('recipient_id'))
          ->update([
            'recipients.member_id' => null
          ]);
      };

我最初认为问题与数据库或表有关,特别是因为“member_id”是外键。但是,我做了两个测试证明并非如此。首先,我确保该列是“无符号”和“可为空”的。其次,我在“where”子句中手动插入了一个整数,而不是“Request::input('recipient_id')”......它工作得很好。我还确认“Request::input('recipient_id')”的值确实是一个整数,它应该在适当的列中工作(即“bigint”类型)。

有什么有用的建议/意见吗?他们将不胜感激。

【问题讨论】:

  • 为什么不检查使用.......update(['member_id' => null])
  • 您收到的实际错误消息是什么?尝试启用查询日志以查看数据库中实际查询的内容,将其放在函数的开头:DB::enableQueryLog();,在查询之后:dd(DB::getQueryLog())
  • 我认为@yuweiwei 走在了正确的轨道上......使用一串“null”作为表单的响应并设置一个 null列中的值。在表单的选择字段中,如果您尝试“取消设置”外键,则应选择“null”字符串以外的其他内容。可能是一个空字符串或从表单中排除该字段并使用if(Request::has('recipient_id'))
  • 是的,@TimJoyce,我最初担心字符串"null",但我测试了if/else,它通过了。我没有显示它,但该值来自<select> 元素,所以它似乎必须是一个字符串。事后看来,我应该把它命名为 "null"haha
  • @Andrew,它没有显示任何错误,这让我更加沮丧。有时间我得试试dd(DB::getQueryLog()) 之类的东西。

标签: mysql laravel sql-update


【解决方案1】:

仅当 Request::input('recipient_id') 为“null”时,代码才会运行到 else 语句中, 但您的 else 语句也使用“null”的“recipient_id”。

所以你的 SQL 语句会找到一个收件人,其中 recipients.id = "null"。

显然你没有任何“recipient_id”是“null”,对吧?

...
else {
    DB::table('recipients')
      ->where('recipients.id','=',Request::input('recipient_id')) // here the recipient_id is "null"
      ->update([
        'recipients.member_id' => null
      ]);
 };
...

【讨论】:

  • 是的,这就是问题所在。用->where('recipients.member_id) 交换->where('recipients.id) 解决了它。感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-28
  • 2023-03-31
  • 2013-03-21
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
相关资源
最近更新 更多