Laravel 5 更新单行限制不起作用


Laravel 5 updating single row limit doesn't work

我需要更新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 的列,该列可用作唯一标识符,以便它可以在子查询中找到与您的条件匹配的第一行。