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ć.