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 mnogiej– Posts
, 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