代码之家  ›  专栏  ›  技术社区  ›  mafortis

具有多个条件的laravel查询更新

  •  0
  • mafortis  · 技术社区  · 5 年前

    我有一个列名为 flag 如果值为 1 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,
    ]
    

    3 回复  |  直到 5 年前
        1
  •  0
  •   Reza Bidar    5 年前

    是因为你打电话来的 whereNull 上的方法 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]);
    
      });
    
    }
    
    

    但为了获得更好的性能,我建议您对标志列使用boolean,并使用这个简单的查询

    DB::table('messages')->whereIn('id', $ids)->update(['flag' => DB::raw('!flag')]);
    
        2
  •  1
  •   Neverever    5 年前

    错误的主要原因是 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') ]);
    }
    
        3
  •  0
  •   AITL DEV11    5 年前

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