我需要更新db(PostgreSQL)中的单个匹配记录,但Limit方法不适用于Update方法。此代码将更新匹配Where条件而不是单个记录的所有记录。
DB::table("records")
->where('need_moderate','=','no')
->where('locked_per_time','<',$date_now->format("Y-m-d H:i:s"))
->limit(1)
->update(["locked_per_time"=>$locked_per->format("Y-m-d H:i:s"),'locked_by'=>$mdkey]);
我如何解决这个问题,以便只更新一条记录?
答案 0 :(得分:1)
与Oracle或MySQL更新语句不同,直接在PostgreSQL update statements上使用LIMIT
是不可能的。因此,将limit(1)
方法链接到Query Builder实例不会做任何事情,因为Laravel的PostgresGrammar
类中负责编译查询的compileUpdate
方法只编译where语句。
但是,您可以通过使用子查询来解决此问题,该子查询仅返回将更新的一行。这样的事情应该有效:
DB::table("records")->whereIn('id', function ($query) use ($date_now) {
$query->from('records')
->select('id')
->where('need_moderate', '=', 'no')
->where('locked_per_time', '<', $date_now->format("Y-m-d H:i:s"))
->limit(1);
})->update(["locked_per_time" => $locked_per->format("Y-m-d H:i:s"), 'locked_by' => $mdkey]);
whereIn('id', ...)
条件假设您的表有一个名为id
的列,可以用作唯一标识符,以便它可以找到与子查询中的条件匹配的第一行。