So erhöhen und aktualisieren Sie die Spalte in einer eloquenten Abfrage

Lesezeit: 3 Minuten

Benutzer-Avatar
Alex Harris

Ist es möglich, einen Zeitstempel zu aktualisieren (außer updated_at) und eine Spalte in einer Abfrage erhöhen? Ich kann es offensichtlich

->increment('count')

und getrennt

->update(['last_count_increased_at' => Carbon::now()])

aber gibt es eine einfache Möglichkeit, beides zusammen zu tun?

Product::where('product_id', $product->id)
    ->update(['count'=> $count + 1, 'last_count_increased_at' => Carbon::now()];

Ohne vorher die Zählung abfragen und abrufen zu müssen?

Benutzer-Avatar
aynber

Du kannst den … benutzen DB::raw Methode:

Product::where('product_id', $product->id)
    ->update([
      'count'=> DB::raw('count+1'), 
      'last_count_increased_at' => Carbon::now()
    ]);

  • Funktioniert großartig, kann nicht glauben, dass ich nicht daran gedacht habe, wollte das Ganze roh machen.

    – Alex Harris

    6. Juni 2016 um 20:24 Uhr

  • Was ist, wenn wir keinen übereinstimmenden Datensatz haben? Wie erstellt man, wenn kein Datensatz gefunden wird, ohne zuerst die Zählung abfragen und abrufen zu müssen?

    – Ajjay Arora

    28. April 2020 um 2:20 Uhr

  • @AjjayArora Das sollte zwar wirklich eine neue Frage sein, aber ich bin mir nicht sicher, ob dies in einem Einzeiler nur mit Eloquent möglich ist. Ich denke, Sie müssten tatsächlich zuerst prüfen, ob die product_id existiert.

    – aynber

    28. April 2020 um 11:22 Uhr


  • @aynber Danke Kumpel für die Antwort.

    – Ajjay Arora

    29. April 2020 um 10:57 Uhr

Benutzer-Avatar
Ali Sharifi Neyestani

Sie können zusätzliche Spalten angeben, die während der Inkrement- oder Dekrementoperation aktualisiert werden sollen:

Product::where('id',$id)
->increment('count', 1, ['increased_at' => Carbon::now()]);

Es ist eine beredtere Lösung.

  • Danke, das war mir nicht bewusst!

    – Alex Harris

    4. März 2019 um 15:08 Uhr

  • Das fühlt sich nach mehr an beredt Lösung.

    – Josch

    19. März 2021 um 14:53 Uhr

Mit Laravel 8 können Sie dies jetzt in einer einzigen Abfrage erreichen, um doppelte Schlüssel zu erstellen oder zu aktualisieren.

$values = [
    'name' => 'Something',
    'count' => 1,
];
$uniqueBy = ['name'];
$update = ['count' => DB::raw('count+1')];

Model::upsert($values, $uniqueBy, $update);

Wenn das Modell existiert count wird inkrementiert, wenn es eingefügt wird count wird gleich 1. Dies erfolgt auf DB-Ebene, sodass nur eine Abfrage erforderlich ist.

Lesen Sie mehr über Upserts: https://laravel.com/docs/8.x/eloquent#upserts

  • Upsert hatte einen anderen Zweck, für den Sie update verwenden können, und es wird Ihnen gut gehen.

    – Steve Moretz

    10. August 2021 um 12:15 Uhr


  • Update funktioniert für ein Modell, das obige funktioniert für mehrere Modellwerte und/oder einen einzelnen und erhöht die Anzahl für jeden. Ich sehe, dass dies nützlich sein kann und alles in einer Abfrage erledigt.

    – verrückt

    16. August 2021 um 9:35 Uhr

  • Kein Update kann auch für mehrere Zeilen der Tabelle funktionieren, auf die Sie sich auf die Update-Methode im Modell beziehen, nicht auf die Update-Methode des Abfrage-Generators.

    – Steve Moretz

    16. August 2021 um 11:25 Uhr

  • Ja, aber nicht mit unterschiedlichen Werten? Ich denke also immer noch, dass dies je nach Anwendungsfall wertvoll sein kann. Ich habe dies zum Beispiel gepostet, nachdem ich genau diesen Fall hatte, viele mit unterschiedlichen Werten aktualisiert und die Anzahl der Besuche auf +1 gesetzt

    – verrückt

    19. August 2021 um 9:04 Uhr

  • Natürlich behaupte ich nicht, dass die Upsert-Methode nutzlos ist, aber in dem Code, den Sie oben angegeben haben, könnte er mit update geändert werden, und es wird nichts schief gehen. Ich sage nur, dass es in diesem speziellen Kontext unnötig ist und die zukünftigen Zuschauer irreführen könnte.

    – Steve Moretz

    19. August 2021 um 9:36 Uhr


1155970cookie-checkSo erhöhen und aktualisieren Sie die Spalte in einer eloquenten Abfrage

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy