# Database seeding

Laravel maakt gebruik van seeding om de database van test- of ontwikkelingsgegevens te voorzien. Seeding is het proces van invoegen van initiële gegevens in de database, zodat je een consistente dataset hebt tijdens het ontwikkelen of testen van je applicatie.

# Voordelen van Seeding in Laravel:

Consistente Testgegevens: Seeding zorgt ervoor dat je altijd met dezelfde testgegevens kunt werken, wat handig is voor het testen van functionaliteit.

Efficiënt Ontwikkelen: Ontwikkelaars kunnen meteen beginnen met het testen van functionaliteit zonder zich zorgen te maken over het handmatig invoeren van testgegevens.

Realistische Dataset: Door dummygegevens in te voegen met seeding, kun je een realistische dataset creëren, wat nuttig is voor het evalueren van de prestaties en functionaliteit van je applicatie.

# Database Factories Aanmaken

Database factories zijn verantwoordelijk voor het genereren van dummygegevens. Je kunt deze factories aanmaken met het Artisan-commando:

ddev artisan make:factory ProjectFactory
1

In de gegenereerde ./database/factories/ProjectFactory.php kun je dan de eigenschappen en waarden van de dummygegevens definiëren.

public function definition(): array
{
    return [
        'name' => fake()->name(),
        'description' => fake()->text(),
        'email' => fake()->safeEmail(),
        'created_at' => fake()->dateTimeInInterval('-50 week', '+50 week'),
    ];
}
1
2
3
4
5
6
7
8
9

Bekijk alle mogelijkheden van de faker (opens new window)

We moeten nu het model linken aan de factory. Dit kan door de HasFactory toe te voegen aan het model.

<?php
namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Project extends Model  {

    use HasFactory;

    ...
}
1
2
3
4
5
6
7
8
9
10
11
12

# Database Seeder Vullen:

Ga naar ./database/seeders/DatabaseSeeder.php en voeg in de run method onderstaande code toe:

public function run()
{
    //remove all data from table
    Project::truncate();
    //add 500 new records
    Project::factory()
        ->count(500)
        ->create();
}
1
2
3
4
5
6
7
8
9

# Seeder runnen

Voer het volgende Artisan-commando uit om de database te seeden:

ddev artisan db:seed
1

Als je een verse database wilt migreren en direct wilt vullen met dummygegevens, kun je het volgende commando gebruiken:

ddev artisan migrate --seed
1

# Database Seeder Aanmaken

Laravel voorziet ook de mogelijkheid om aparte database seeders aan te maken, bijvoorbeeld per Model. je kan een Seeder class aan via onderstaande artisan code.

ddev artisan make:seeder ProjectSeeder
1

Hierin kan je dan de code opsplitsen per model.

<?php

namespace Database\Seeders;

use App\Models\Project;
use Illuminate\Database\Seeder;

class ProjectSeeder extends Seeder
{
    public function run(): void
    {
        //remove all data from table
        Project::truncate();
        //add 500 new records
        Project::factory()
            ->count(500)
            ->create();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

In je default DatabaseSeeder kan je deze dan aanroepen via de call method.

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     */
    public function run(): void
    {
        //run project seeder
        $this->call(ProjectSeeder::class);
    }
}
1
2
3
4
5
6
7
8
9
10
11

Uitvoeren kan nog steeds met ddev artisan db:seed. Maar je kan ook een specifieke class meegeven als je enkel die wil uitvoeren.

ddev artisan db:seed --class=ProjectSeeder
1

# Tussentabel vullen

Hieronder zien jullie een voorbeeld van het opvullen van een tussentabel waarbij er reeds projecten waren aangemaakt en gevuld via een seed.

//tussentabel leeg maken
DB::table('employee_project')->truncate();
Employee::truncate();

//Medewerkers vullen
Employee::factory()->count(50)->create();

//koppel 1-3 random projecten aan elke medewerker
foreach (Employee::all() as $employee) {
    $projects = Project::inRandomOrder()->take(rand(1, 3))->pluck('id');
    foreach ($projects as $projectId) {
        DB::table('employee_project')->insert([
            'employee_id' => $employee->id,
            'project_id' => $projectId,
            'created_at' => now(),
            'updated_at' => now(),
        ]);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# Meer info

© 2024 Arteveldehogeschool Laatst bijgewerkt: 7/12/2023 14:05:20