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

Php Laravel 5更新单行限制不起作用,php,postgresql,laravel,limit,Php,Postgresql,Laravel,Limit,我需要在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(["lo

我需要在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]);
如何解决这一问题,以便只更新一条记录?

与with或update语句不同,不可能直接使用LIMIT on。因此,将limit1方法链接到查询生成器实例没有任何作用,因为来自Laravel的PostgresGrammar类(负责编译查询)的方法只编译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]);

其中的'id'。。。条件假设您的表有一个名为id的列,该列可以用作唯一标识符,以便它可以在子查询中找到与您的条件匹配的第一行。

不幸的是,代码工作不正常。即使有2-4个线程,相同的记录仍会发布到不同的线程。我假设第二个线程的内部选择在第一个线程更新之前执行。我很感激你的帮助,我不知道我是否理解。请提供更详细的上下文,说明您希望更新过程如何工作。对于每个查询,我们都会通过每次更改其锁定的\u来更新记录。在此之后,我们从该记录中获取数据。虽然当前日期小于每次锁定的日期,但此记录不应可用于其他线程,并且决不能使用两次。但是,即使使用您提供的代码,当我运行多个线程时,在第一个线程每次更新锁定的线程之前,它们以某种方式在同一时间获得相同的记录,我也考虑过,但我不确定这是否有助于同时处理大量请求的多线程。我也认为对DB COS的原始请求肯定是单个事务,您做过类似的事情,这两个选项的优缺点是什么?谢谢