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

时间:2016-01-20 21:45:17

标签: 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(["locked_per_time"=>$locked_per->format("Y-m-d H:i:s"),'locked_by'=>$mdkey]);

我如何解决这个问题,以便只更新一条记录?

1 个答案:

答案 0 :(得分:1)

OracleMySQL更新语句不同,直接在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的列,可以用作唯一标识符,以便它可以找到与子查询中的条件匹配的第一行。