Skip to content

Latest commit

 

History

History
156 lines (117 loc) · 5.76 KB

File metadata and controls

156 lines (117 loc) · 5.76 KB

Baza danych: Seedowanie

Wprowadzenie

Laravel zawiera możliwość wypełniania bazy danych danymi za pomocą klas seed. Wszystkie klasy seed są przechowywane w katalogu database/seeders. Domyślnie zdefiniowana jest dla Ciebie klasa DatabaseSeeder. Z tej klasy możesz użyć metody call, aby uruchomić inne klasy seed, co pozwala kontrolować kolejność seedowania.

Note

Ochrona przed masowym przypisaniem jest automatycznie wyłączana podczas seedowania bazy danych.

Pisanie seederów

Aby wygenerować seeder, wykonaj polecenie Artisan make:seeder. Wszystkie seedery wygenerowane przez framework zostaną umieszczone w katalogu database/seeders:

php artisan make:seeder UserSeeder

Klasa seedera domyślnie zawiera tylko jedną metodę: run. Ta metoda jest wywoływana, gdy wykonywane jest polecenie Artisan db:seed. W metodzie run możesz wstawiać dane do swojej bazy danych w dowolny sposób. Możesz użyć konstruktora zapytań do ręcznego wstawiania danych lub możesz użyć fabryk modeli Eloquent.

Jako przykład zmodyfikujmy domyślną klasę DatabaseSeeder i dodajmy instrukcję wstawiania do bazy danych do metody run:

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;

class DatabaseSeeder extends Seeder
{
    /**
     * Run the database seeders.
     */
    public function run(): void
    {
        DB::table('users')->insert([
            'name' => Str::random(10),
            'email' => Str::random(10).'@example.com',
            'password' => Hash::make('password'),
        ]);
    }
}

Note

Możesz określić type-hint dla dowolnych zależności, których potrzebujesz w sygnaturze metody run. Będą one automatycznie rozwiązane przez kontener usług Laravel.

Używanie fabryk modeli

Oczywiście ręczne określanie atrybutów dla każdego seedu modelu jest uciążliwe. Zamiast tego możesz użyć fabryk modeli, aby wygodnie wygenerować duże ilości rekordów bazy danych. Najpierw przejrzyj dokumentację fabryk modeli, aby dowiedzieć się, jak definiować swoje fabryki.

Na przykład stwórzmy 50 użytkowników, z których każdy ma jeden powiązany post:

use App\Models\User;

/**
 * Run the database seeders.
 */
public function run(): void
{
    User::factory()
        ->count(50)
        ->hasPosts(1)
        ->create();
}

Wywoływanie dodatkowych seederów

W klasie DatabaseSeeder możesz użyć metody call, aby wykonać dodatkowe klasy seed. Użycie metody call pozwala podzielić seedowanie bazy danych na wiele plików, tak aby żadna pojedyncza klasa seedera nie stała się zbyt duża. Metoda call akceptuje tablicę klas seedera, które powinny zostać wykonane:

/**
 * Run the database seeders.
 */
public function run(): void
{
    $this->call([
        UserSeeder::class,
        PostSeeder::class,
        CommentSeeder::class,
    ]);
}

Wyciszanie zdarzeń modeli

Podczas uruchamiania seedów możesz chcieć zapobiec wysyłaniu zdarzeń przez modele. Możesz to osiągnąć, używając traitu WithoutModelEvents. Gdy jest używany, trait WithoutModelEvents zapewnia, że żadne zdarzenia modelu nie są wysyłane, nawet jeśli dodatkowe klasy seed są wykonywane za pomocą metody call:

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;

class DatabaseSeeder extends Seeder
{
    use WithoutModelEvents;

    /**
     * Run the database seeders.
     */
    public function run(): void
    {
        $this->call([
            UserSeeder::class,
        ]);
    }
}

Uruchamianie seederów

Możesz wykonać polecenie Artisan db:seed, aby zaseedować bazę danych. Domyślnie polecenie db:seed uruchamia klasę Database\Seeders\DatabaseSeeder, która z kolei może wywoływać inne klasy seed. Możesz jednak użyć opcji --class, aby określić konkretną klasę seedera do uruchomienia indywidualnie:

php artisan db:seed

php artisan db:seed --class=UserSeeder

Możesz również zaseedować bazę danych za pomocą polecenia migrate:fresh w połączeniu z opcją --seed, co usunie wszystkie tabele i ponownie uruchomi wszystkie Twoje migracje. To polecenie jest przydatne do całkowitego przebudowania bazy danych. Opcja --seeder może być użyta do określenia konkretnego seedera do uruchomienia:

php artisan migrate:fresh --seed

php artisan migrate:fresh --seed --seeder=UserSeeder

Wymuszanie uruchamiania seederów w produkcji

Niektóre operacje seedowania mogą spowodować zmianę lub utratę danych. Aby chronić Cię przed uruchamianiem poleceń seedowania na Twojej produkcyjnej bazie danych, zostaniesz poproszony o potwierdzenie, zanim seedery zostaną wykonane w środowisku production. Aby wymusić uruchomienie seederów bez monitu, użyj flagi --force:

php artisan db:seed --force