Writing Seeders
Um einen Seeder zu erzeugen, führen Sie den Befehl make:seeder Artisan aus. Alle vom Framework generierten Seeder werden im Verzeichnis database/seeds abgelegt:
php artisan make:seeder UsersTableSeeder
Eine Seeder-Klasse enthält standardmäßig nur eine Methode: run. Diese Methode wird aufgerufen, wenn der Befehl db:seed Artisan ausgeführt wird. Innerhalb der run-Methode können Sie Daten in Ihre Datenbank einfügen, wie Sie möchten. Sie können den Query Builder verwenden, um Daten manuell einzufügen oder Sie können Eloquent Model Factories verwenden.
Der Massenzuweisungsschutz (Mass assignment protection) wird automatisch während des Datenbank-Seedings deaktiviert.
Als Beispiel modifizieren wir die standardmäßige DatabaseSeeder-Klasse und fügen der run-Methode eine Datenbankeinfügeanweisung hinzu:
<?php
use Illuminate\Support\Str;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class DatabaseSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
DB::table('users')->insert([
'name' => Str::random(10),
'email' => Str::random(10).'@gmail.com',
'password' => bcrypt('password'),
]);
}
}
Sie können innerhalb der Signatur der
run-Methode alle benötigten Abhängigkeiten eingeben. Sie werden automatisch über den Laravel
Service Container aufgelöst.
Using Model Factories
Natürlich ist es umständlich, die Attribute für jedes Seeder-Modell manuell festzulegen. Stattdessen können Sie Modell-Factories verwenden, um bequem große Mengen an Datenbanksätzen zu erzeugen. Sehen Sie sich zunächst die Dokumentation der Modell-Factories an, um zu erfahren, wie Sie Ihre Factories definieren. Sobald Sie Ihre Factories definiert haben, können Sie die factory-Hilfsfunktion verwenden, um Datensätze in Ihre Datenbank einzufügen.
Erstellen wir beispielsweise 50 Benutzer und fügen jedem Benutzer eine Beziehung zu:
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
factory(App\User::class, 50)->create()->each(function ($user) {
$user->posts()->save(factory(App\Post::class)->make());
});
}
Calling Additional Seeders
Innerhalb der DatabaseSeeder-Klasse können Sie die call-Methode verwenden, um weitere Seed-Klassen auszuführen. Die Verwendung der call-Methode erlaubt es Ihnen, Ihre Datenbank-Seeds in mehrere Dateien aufzubrechen, so dass keine einzelne Seeder-Klasse übermäßig groß wird. Übergeben Sie den Namen der Seeder-Klasse, die Sie ausführen möchten:
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
$this->call([
UsersTableSeeder::class,
PostsTableSeeder::class,
CommentsTableSeeder::class,
]);
}
Running Seeders
Nachdem Sie Ihre Seeder geschrieben haben, müssen Sie möglicherweise den Autoloader des Composers mit dem Befehl dump-autoload neu generieren:
composer dump-autoload
Jetzt können Sie den db:seed Artisan Befehl verwenden, um Ihre Datenbank zu füllen. Standardmäßig führt der db:seed-Befehl die DatabaseSeeder-Klasse aus, die zum Aufrufen anderer Seed-Klassen verwendet werden kann. Sie können jedoch die --class Option verwenden, um eine bestimmte Seeder-Klasse anzugeben, die individuell ausgeführt werden soll:
php artisan migrate:refresh --seed
Forcing Seeders To Run In Production
Einige Seeding-Vorgänge können dazu führen, dass Sie Daten verändern oder verlieren. Um Sie vor der Ausführung von Seeding-Befehlen gegen Ihre Produktionsdatenbank zu schützen, werden Sie vor der Ausführung der Seeder zur Bestätigung aufgefordert. Um die Sägeräte zu zwingen, ohne eine Aufforderung auszuführen, verwenden Sie das --force-Flag:
php artisan db:seed --force