Doctrine Entity-Wert erhöhen (Download-Zähler)
Möchte ich erhöhen Sie einen Wert in meine Lehre Person.
Zurzeit mache ich es auf diesem Weg.
$file->setDownloadCounter($file->getDownloadCounter() + 1);
$em = $this->getDoctrine()->getManager();
$em->persist($fileVersion);
$em->flush();
Ist es Weise zu führen, so etwas wie dieses in der Lehre:
UPDATE file SET downloadCounter = downloadCounter + 1 WHERE id = 1
EDIT:
Das problem in der Lehre-Beispiel oben ist, dass zwischen dem laden und bündig ist die Zeit, wo andere konnten die Datei herunterladen und so der Zähler ist nicht korrekt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie auch die folgenden in einem entity repository:
Oder mit DQL:
Oder durch eine vereinfachte DQL:
Der Nachteil dieser Lösungen: wenn die Entität bereits geladen wurde, wird es die Vorherige Anzahl und nicht die inkrementiert count.
Die Art und Weise Sie getan haben ist völlig in Ordnung, aber eine bessere Möglichkeit ist das hinzufügen von ein Inkrement-Methode, um Ihre Einheit.
Follow-up von Radu C Kommentar: die vereinfachte DQL ist die einzige Lösung, die garantiert die richtige Zählung.
Den Abfrage-Schritten basierend auf dem Wert in der Datenbank und sperrt die Tabelle Garantie Abfragen ausgeführt werden, die in einer Sequenz.
In der Erwägung, dass die anderen Abfragen verwenden Sie den Wert in der PHP-Laufzeitumgebung, die möglicherweise einen veralteten Wert: einige andere Wunsch vielleicht schon inkrementiert den Wert in der Datenbank, daher Inkrementieren basierend auf dem Wert in der PHP Speicher überschreiben Schrittweite von anderen Anfragen.
:downloadCounter
ich habef.downloadCounter + 1
und Hinzugefügt, wo Sie für die Datei-IdSicherste Weg, dies zu tun ist mit Doctrine DBAL und rufen Sie raw-SQL, die Art und Weise, Sie entfernen die chance race-condition und machen den Wechsel von atomic. Andere option ist, um das Feld versioniert und verwenden optimistic locking oder pessimistisch DB-level locking.
Können Sie einfach fügen Sie eine increment-Methode, um Ihr Modell.