php - php Laravel 查詢更新,具有多個條件

  显示原文与译文双语对照的内容
54 4

如果值為 1,並且值為 null1,但issue到,但issue到控制器,而不僅僅是一個數據,那麼我將更新它。

代碼
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,
]

我為什麼會出錯的

时间: 原作者:

105 3

錯誤的主要原因是 update() 方法不是可以鏈接的

或者,你也可以使用mysql語句在一個查詢中進行更新。

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') ])
}
原作者:
75 4

不能在舊更新的返回值上鏈接新的更新。

相反,保存原始查詢,並執行兩個單獨的更新:

public function flagmultiplemessage()
{
 $query = DB::table('messages')->whereIn('id', request('ids'));
 with(clone $query)->whereNotNull('messages.flag')->update(['flag' => null]);
 $query->whereNull('messages.flag')->update(['flag' => '1']);
}
原作者:
72 3

你可以這樣做

DB::table('messages')->whereIn('id', $ids)->where(function ($query) {
 $query->whereNotNull('messages.flag')->update(['flag' => null])
 ->orWhereNull('messages.flag')->update(['flag' => '1']);
 })
71 4

它發生在 update 方法中調用 whereNull 方法。你應該像這樣運行 3個單獨的查詢。

public function flagmultiplemessage(Request $request){
 $ids = $request->input('ids');
 DB::transaction(function () {
 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]);
 });
}

但是為了提高性能,我建議你使用flag標記列並使用這個簡單的查詢

DB::table('messages')->whereIn('id', $ids)->update(['flag' => DB::raw('!flag')]);
...