我有一个名为flag
的列,如果值从1
到null
,并且值从null
到1
,我想更新它易于更新本专栏,但问题来了,我将多个数据发送给控制器,而不仅仅是一个。
public function flagmultiplemessage(Request $request){
$ids = $request->input('ids');
DB::table('messages')->whereIn('id', $ids)
->whereNotNull('messages.flag')->update(['flag' => null])
->whereNull('messages.flag')->update(['flag' => '1']);
}
具有以上功能的我得到:
message Call to a member function whereNull() on integer
代码是这样的:
ids = [11, 12, 3]
database = [
11->flag = 1,
12->flag = null,
3->flag = 1,
]
最上面的代码结果改变了我的数据库,例如:
database = [
11->flag = null,
12->flag = 1,
3->flag = null,
]
知道我为什么会出错吗?
答案 0 :(得分:1)
该错误的主要原因是update()
方法不可可链接
或者,您可以使用mysql Case语句在一个查询中进行更新。
public function flagmultiplemessage(Request $request) {
$ids = $request->input('ids');
DB::table('messages')->whereIn('id', $ids)
->update(['flag' => DB::raw('case when flag is null then 1 else null end') ]);
}
答案 1 :(得分:0)
您可以做到
DB::table('messages')->whereIn('id', $ids)->where(function ($query) {
$query->whereNotNull('messages.flag')->update(['flag' => null])
->orWhereNull('messages.flag')->update(['flag' => '1']);
})
答案 2 :(得分:0)
发生此问题是因为您在update
方法上调用了public function flagmultiplemessage(Request $request){
$ids = $request->input('ids');
DB::transaction(function () use ($ids) {
DB::table('messages')->whereIn('id', $ids)
->whereNotNull('messages.flag')->update(['flag' => 0]);
DB::table('messages')->whereIn('id', $ids)
->whereNull('messages.flag')->update(['flag' => 1]);
DB::table('messages')->whereIn('id', $ids)
->where('messages.flag', 0)->update(['flag' => null]);
});
}
方法。
您应该像这样运行3个单独的查询。
DB::table('messages')->whereIn('id', $ids)->update(['flag' => DB::raw('!flag')]);
但是为了获得更好的性能,我建议您将布尔值用于标志列并使用此简单查询
$("form[class='validate']").each({
var rules = {};
var method = $(this).attr("vMethod");
console.log("validating");
switch(vMethod)
{
case "roles":
rules = {rules:...} // your library
break;
case "user":
rules = {rules:...} // your library
break;
}
$(this).validate(rules);
});