Kontynuacja lekcji poprzednich. Dalej poznajemy SQL jako taki oraz SQL w Laravelu. Do dzieła.
Ok, wejdźmy do tabelki people (w testowej bazie danych, nie Laravelowej) i napiszmy taki kod:
ALTER TABLE `people`
ADD COLUMN
cash decimal(15,2) AFTER name;
Dodaje on kolumnę do już istniejącej tabeli. Laravelowy odpowiednik to coś takiego:
Schema::table('notes', function (Blueprint $table) {
$table->integer('delete_count')->unsigned()->default(0);
$table->integer('restore_count')->unsigned()->default(0);
$table->integer('update_count')->unsigned()->default(0);
});
Oczywiście inny typ i inna tabela. Rzućmy okiem co nasza komenda nam dodała:
- pole cash do istniejącej tabeli
- cash dla już wcześniej istniejących rekordów wynosi 0
- pole cash zostało dodane po polu name, nie w normalniej kolejności (czyli na końcu)
Ciekawe. Teraz usuniemy już istniejącą kolumnę z tej tabeli:
ALTER TABLE `people`
DROP COLUMN cash;
Pamiętamy chyba jeszcze jak usuwaliśmy kolumny w migracjach Laravela w metodzie down:
public function down(): void
{
Schema::table('notes', function (Blueprint $table) {
$table->dropColumn('delete_count');
$table->dropColumn('restore_count');
$table->dropColumn('update_count');
});
}
To teraz wiemy co tak naprawdę Laravel robi za nas.
Ok, zobaczmy taki kod:
ALTER TABLE `people`
ADD COLUMN
cash decimal(15,2) NOT NULL AFTER name;
Szczerze, myślałem, że będzie error. Bo próbujemy dodać pole z constraintem NOT NULL, a mamy już rekordy w bazie danych bez tego pola i nie mamy ustawionego default.
Ale myliłem się – rekordy już istniejące dostały cash 0.00. Co nie oznacza, że jest to od teraz default dla nowych rekordów. Jak chcemy ustawić default, musimy modyfikować kolumnę:
ALTER TABLE `people`
MODIFY COLUMN
cash decimal(15,2) NOT NULL DEFAULT 0.00 AFTER age;
Albo mogliśmy przy dodawaniu jej ustawić default, to już od nas zależy.
Poza ADD (dodaj kolumnę) i MODIFY (modyfikuj) mamy też słówko ALTER na samej kolumnie. Trochę jest tych słówek, ja podam dwa przykłady jak dodać defaulta i dropnąć defaulta z istniejącej kolumny:
ALTER TABLE MyTable
ALTER COLUMN foo
SET DEFAULT 'bar';
ALTER TABLE MyTable
ALTER COLUMN foo
DROP DEFAULT;
Ok, ale wracając do after – after może określić po jakiej kolumnie ma być nasza kolumna. Dodanie kolumny z afterem:
Schema::table('users', function($table)
{
$table->string('phone_nr')->after('id');
});
Modyfikacja już istniejącej kolumny, żeby postawić ją w innym miejscu (przykład z internetu, ja bym tego nie robił):
public function up()
{
DB::statement("ALTER TABLE example MODIFY COLUMN foo DATE AFTER bar");
}
public function down()
{
DB::statement("ALTER TABLE example MODIFY COLUMN foo DATE AFTER bar");
}
Zarówno w SQL mamy też słówko FIRST i w Laravelu również je widzieliśmy jako metoda ->first() na kolumnie w migracji.