Seedowanie w Laravel

Seedowanie bazy danych. Najprościej można to wytłumaczyć jako zautomatyzowanie fabryki (ang. factory). Zamiast ręcznie produkować wpisy zajmie się tym fabryka. Oczywiście mając już założoną fabrykę – w tym przypadku jest to przygotowanie dwóch różnych rodzajów wpisów na blogu. Jeden jako zwykła treść, a drugi zamiast treści ma tylko zdjęcie. Więcej przeczytasz w artykule: Laravel | Fabryka czyli factory

Zacznijmy od utworzenia seedera. Przechodzimy do konsoli i wpisujemy:

php artisan make:seeder PostsTableSeeder

Zwróć uwagę na konwencję, a jest ona taka, że pierwszy człon jest to nazwa modelu w liczbie mnogiejPosts, następnie Table i oczywiście co to jest – Seeder, a w ten sposób utworzony zostanie właśnie PostsTableSeeder, którego możemy znaleźć: database/seeds/PostsTableSeeder.php.

Teraz pokażmy sobie jak wygląda taki świeżo utworzony seeder:

<?php

use Illuminate\Database\Seeder;

class PostsTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        //
    }
}

Do metody run() możemy wprowadzić polecenia, które zmuszą metodę do produkcji, np:

factory(App\Post::class, 5)->create();

Polecenie to odwoła się do fabryki, aby wyprodukowała 5 wpisów i za pośrednictwem polecenia ->create() bezzwłocznie umieściła je w bazie danych. W takim razie jak uruchomić seedera? Wróćmy do konsoli, a w niej wykonajmy polecenie:

php artisan db:seed --class=PostsTableSeeder

No dobrze, ale jak może pamiętasz w fabryce mamy przygotowane dwa rodzaje wpisów? Na potrzeby naszych testów uznajmy, że chcemy na przemian mieć 1 post typu text a drugi typu post. Wystarczy, posłużyć się takim kodem:

public function run()
    {
        foreach (range(1, 10) as $i) {
            $factory = factory(App\Post::class);

            if($i % 2 === 0){
                $factory->state('image');
            }

            $factory->create();
        }
    }

Omówmy powyższy kod. Linia 3 – deklarujemy pętlę od 1 do 10, czyli chcemy 10 wpisów. Do zmiennej $i przypisujemy numer wpisu. W lini 4 tworzony jest obiekt $factory. W linii 6 sprawdzamy czy wpis jest parzysty, jeżeli tak, to wykonujemy na obiekcie metodę ->state('image') i w linii 10 jednocześnie tworzony jest taki wpis i dodawany do bazy danych.

Musimy się jeszcze zastanowić nad tym jak to będzie wyglądać sytuacja gdy będziemy posiadać więcej seederów, np: seeder dla komentarzy, dla galerii, dla tworzenia użytkowników, ankiet itp. a zostaniemy zmuszeni w fazie developmentu do wyczyszczenia danych z bazy danych. Każdy taki seeder będziemy musieli uruchamiać ręcznie?

php artisan db:seed --class=PostsTableSeeder
php artisan db:seed --class=CommentsTableSeeder
php artisan db:seed --class=GalleriesTableSeeder
php artisan db:seed --class=UsersTableSeeder
itd...

Na szczęście ktoś już o tym pomyślał i jak dobrze się przyjrzysz w katalogu seeds (database/seeds/) znajdziesz default-owego seeda: DatabaseSeeder.php. Plik wygląda tak:

<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        // $this->call(UsersTableSeeder::class);
    }
}

Teraz do metody run możemy wpisać nasze seedery (pamiętajmy oczywiście, że musimy je umieścić w tablicy):

public function run()
    {
        $this->call([
            PostsTableSeeder::class,
            CommentsTableSeeder::class,
            GalleriesTableSeeder::class,
            UsersTableSeeder::class,
            itd...      
        ]);
    }

Wykorzystanie pliku DatabaseSeeder.php pozwoli nam wywołać jeden plik, a wszystkie wpisane w metodę run() seedery zostaną wykonana jeden po drugim. Cały ten zabieg sprowadził się do wykonania tylko jednego polecenia:

php artisan db:seed