Blok 3 · rozdział 7

Baza danych i migracje

W tym bloku szczyty trafiają do MySQL. Strukturę tabel opisujesz migracją, czyli plikiem PHP, który na każdym stanowisku uruchomisz tym samym poleceniem php artisan migrate.

Po tym rozdziale powinieneś umieć

  • założyć bazę korona i wpisać ją do .env;
  • odróżnić migrację od ręcznego klikania tabeli tylko w phpMyAdmin;
  • utworzyć pasma i szczyty z kluczem obcym;
  • cofnąć ostatnią migrację, gdy schemat jest zły, i puścić ją ponownie.

1. Baza i .env

  1. Włącz MySQL w Laragonie.
  2. W HeidiSQL albo phpMyAdmin utwórz pustą bazę korona. Kodowanie: utf8mb4_unicode_ci.
  3. W .env ustaw dostęp. W Laragonie użytkownik root często nie ma hasła.
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=korona
DB_USERNAME=root
DB_PASSWORD=
php artisan config:clear
Baza a SZBD Tak jak na BD: MySQL to serwer, phpMyAdmin to klient do podglądu. Aplikacja Laravel jest kolejnym klientem. Tabel nie projektujesz „na zawsze” kliknięciami — opis zostaje w migracji, żeby kolega po migrate miał ten sam schemat.

2. Pierwsze migrate

php artisan migrate

Laravel zakłada własne tabele: users, cache, jobs i tabelę migracji, która pamięta, które pliki już poszły. W phpMyAdmin mają być widoczne, jeszcze bez szczytów.

Sesja może zostać plikowa. Nie przełączaj SESSION_DRIVER z powrotem na database. Plikowa sesja jest dla tego kursu wystarczająca.

3. Tabela pasm

php artisan make:migration create_pasma_table

W nowym pliku w database/migrations metoda up:

Schema::create('pasma', function (Blueprint $table) {
    $table->id();
    $table->string('nazwa');
    $table->string('slug')->unique();
    $table->timestamps();
});

down zostaw z Schema::dropIfExists('pasma') — generator zwykle to wpisuje. Potem php artisan migrate.

Migracja Wersja schematu bazy w kodzie. up tworzy albo zmienia tabelę. down cofa tę zmianę. Plików migracji, które już weszły na bazę, nie poprawiasz „w miejscu”, jeśli ktokolwiek je uruchomił — dodajesz nową migrację albo, na samych zajęciach, robisz rollback i edytujesz, zanim w tabeli są dane.

4. Tabela szczytów i klucz obcy

php artisan make:migration create_szczyty_table
Schema::create('szczyty', function (Blueprint $table) {
    $table->id();
    $table->foreignId('pasmo_id')->constrained('pasma')->cascadeOnDelete();
    $table->string('nazwa');
    $table->string('slug')->unique();
    $table->unsignedSmallInteger('wysokosc_m');
    $table->text('opis')->nullable();
    $table->timestamps();
});

foreignId('pasmo_id')->constrained('pasma') to klucz obcy do pasma.id. Nazwę tabeli podajesz wprost, bo Laravel od słowa pasmo_id szukałby tabeli pasmos.

cascadeOnDelete() oznacza: skasowanie pasma kasuje jego szczyty. Na kursie pasm nie kasujesz z palca. Reguła i tak ma być świadoma — znasz ją z integralności referencyjnej.

php artisan migrate
Gdy migracja padnie w połowie Czytaj pierwszą linijkę błędu (najczęściej zła nazwa tabeli albo brak bazy). Popraw plik, który jeszcze nie wszedł. Jeśli wszedł i jest zły: php artisan migrate:rollback cofa ostatnią paczkę, potem poprawiasz up i migrujesz znów. Struktury nie rzeźbisz obok w phpMyAdmin — następny migrate na innym komputerze o tym nie wiedziałby.
Polskie kolumny, angielska tabela users nazwa i wysokosc_m czytasz w phpMyAdmin bez słownika. Tabela users zostaje po angielsku, bo zakłada ją Laravel, a w bloku 4 rozbuduje ją Breeze.
Commit

Gdy php artisan migrate przechodzi, a w phpMyAdmin widać pasma i szczyty:

git add .
git status
git commit -m "Migracje pasm i szczytów"

Przed commitem git status nie pokazuje .env. W historii zostają pliki migracji, nie zrzut bazy.