Laravel查询更新有多个条件

时间:2019-02-17 06:00:28

标签: php laravel

我有一个名为flag的列,如果值从1null,并且值从null1,我想更新它易于更新本专栏,但问题来了,我将多个数据发送给控制器,而不仅仅是一个。

代码

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

dd

上面的

代码是这样的:

ids = [11, 12, 3]
database = [
  11->flag = 1,
  12->flag = null,
  3->flag = 1,
]

最上面的代码结果改变了我的数据库,例如:

database = [
  11->flag = null,
  12->flag = 1,
  3->flag = null,
]

知道我为什么会出错吗?

3 个答案:

答案 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);
});