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