我需要更新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]);
我该如何解决此问题,以便只更新一条记录?
与 Oracle 或 MySQL 更新语句不同,直接在 PostgreSQL 更新语句上使用 LIMIT
是不可能的。因此,将 limit(1)
方法链接到查询生成器实例没有任何作用,因为 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
的列,该列可用作唯一标识符,以便它可以在子查询中找到与您的条件匹配的第一行。