PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Laravel 5, das das Limit für einzelne Zeilen aktualisiert, funktioniert nicht

Anders bei Oracle oder MySQL update-Anweisungen mit LIMIT direkt auf PostgreSQL-Update-Anweisungen Ist nicht möglich. Also das limit(1) verketten -Methode an die Query Builder-Instanz nichts bewirkt, da die compileUpdate -Methode aus Laravels PostgresGrammar Klasse, die für das Kompilieren der Abfrage verantwortlich ist, kompiliert nur die Where-Anweisungen.

Sie könnten dies jedoch umgehen, indem Sie eine Bedingung verwenden, die eine Unterabfrage verwendet, die nur eine Zeile zurückgibt, die aktualisiert wird. So etwas sollte funktionieren:

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

Der whereIn('id', ...) Bedingung geht davon aus, dass Ihre Tabelle eine Spalte mit dem Namen id hat der als eindeutiger Bezeichner verwendet werden kann, damit er die erste Zeile finden kann, die Ihren Bedingungen in der Unterabfrage entspricht.