Kontynuujemy naukę Laravela, Query Buildera, Eloquent ORMa i innych rzeczy. Tym razem patrzymy na update. Do dzieła.

Ok, poprzednio mieliśmy rekord bez ustawionego created at. Naprawimy to teraz:

Artisan::command('update-created-at', function () {
    $affectedRows = Person::whereNull('created_at')
    ->update(['created_at' => \Carbon\Carbon::now()]);
    
    $this->comment($affectedRows);
    
});

Za pierwszym razem affectedRows 1, potem 0. Ok, zobaczmy jak zrobić update wieku, zwiększenie go o 1:

Artisan::command('increment-age {id}', function (int $id) {

    $person = Person::findOrFail($id);
    $person->age = $person->age + 1;
    $person->save();

    $this->comment("Name: {$person->firstName} {$person->lastName}");
    $this->comment("Age: {$person->age}");
    $this->comment("Created at: {$person->created_at}");
});

Od razu wypisuje nam info. Dobra, a teraz fajna rzecz – zwiększ o 1 wiek wszystkim osobom w bazie danych (bo rok się zmienił na przykład):

Artisan::command('increment-ages', function () {
    
    $affectedRows = Person::increment('age');
    $this->comment($affectedRows);

});

Podobne zabawy mamy w QB, w dodatku i tu i tam możemy ustawić o ile zwiększyć daną kolumnę, decrement też mamy:

DB::table('users')->increment('votes');
 
DB::table('users')->increment('votes', 5);
 
DB::table('users')->decrement('votes');
 
DB::table('users')->decrement('votes', 5);

Możemy też zrobić update jakiejś innej, niepowiązanej kolumny podczas incrementa:

DB::table('users')->increment('votes', 1, ['updated_at' => \Carbon\Carbon::now()]);

Mamy też incrementEach, czyli inkrementacja kilku różnych kolumn o ileś (też różne):

DB::table('users')->incrementEach([
    'votes' => 5,
    'balance' => 100,
]);

Inne metody robienia update:

$affected = DB::table('users')
              ->where('id', 1)
              ->update(['options->enabled' => true]);

W Eloquent ORM też je mamy:

Flight::where('active', 1)
      ->where('destination', 'San Diego')
      ->update(['delayed' => 1]);

Jest też bardzo ciekawa metoda updateOrCreate:

$flight = Flight::updateOrCreate(
    ['departure' => 'Oakland', 'destination' => 'San Diego'],
    ['price' => 99, 'discounted' => 1]
);

Logika jest taka, że pierwsze to warunek, drugie to update, zaś jeśli zawierający pierwsze nie istnieje, to zostanie utworzony nowy, który będzie mergem tych dwóch. Czasami może się przydać.