Ao contrário do Oracle ou MySQL instruções de atualização, usando
LIMIT
diretamente em instruções de atualização do PostgreSQL
não é possível. Então, encadeando o limit(1)
para a instância do Query Builder não faz nada, porque o compileUpdate
método do PostgresGrammar
do Laravel classe que é responsável por compilar a consulta, apenas compila as instruções where. No entanto, você pode superar isso tendo uma condição que usa uma subconsulta que retorna apenas uma linha que será atualizada. Algo assim deve funcionar:
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]);
O
whereIn('id', ...)
condição assume que sua tabela tem uma coluna chamada id
que pode ser usado como um identificador exclusivo para localizar a primeira linha que corresponda às suas condições na subconsulta.