PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Laravel 5 mettant à jour la limite d'une seule ligne ne fonctionne pas

Contrairement à Oracle ou MySQL mettre à jour les instructions, en utilisant LIMIT directement sur instructions de mise à jour PostgreSQL n'est pas possible. Donc enchaîner le limit(1) à l'instance de Query Builder ne fait rien, car compileUpdate méthode de PostgresGrammar de Laravel responsable de la compilation de la requête, ne compile que les instructions where.

Vous pouvez cependant surmonter cela en ayant une condition qui utilise une sous-requête qui ne renvoie qu'une seule ligne qui sera mise à jour. Quelque chose comme ceci devrait fonctionner :

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]);

Le whereIn('id', ...) condition suppose que votre table a une colonne nommée id qui peut être utilisé comme identifiant unique afin qu'il puisse trouver la première ligne qui correspond à vos conditions dans la sous-requête.