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.