【发布时间】: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