Сделать сеялку для конкретных значений

Я использую сеялку в Laravel. У меня есть стол nationalities это имеет два столбца: id а также name. Я хочу использовать более одной записи с определенными уникальными значениями (немецкий, французский и т. Д.).

NationalitySeeder.php

use Illuminate\Database\Seeder;
use App\Nationality;

class NationalitySeeder extends Seeder
{
    public function run()
    {
        $nation = Nationality::create([
            'name' => 'american'
        ]);
    }
}

DatabaseSeeder.php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /** Seed the application's database **/

    public function run()
    {
        $this->call(NationalitySeeder::class);
    }
}

2 ответа

Ответ обновлен для Laravel 8.x.

database/seeders/NationalitySeeder.php:

      <?php

namespace Database\Seeders;

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

class NationalitySeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $nationalities = ['German', 'French'];

        Nationality::factory()
            ->count(count($nationalities))
            ->sequence(fn ($sequence) => ['name' => $nationalities[$sequence->index]])
            ->create();
    }
}

database/factories/NationalityFactory.php:

      <?php

namespace Database\Factories;

use Illuminate\Database\Eloquent\Factories\Factory;

class NationalityFactory extends Factory
{
    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition()
    {
        return [
            // the following default value is overwritten by NationalitySeeder
            'name' => $this->faker->languageCode(),
        ];
    }
}

Сделать заводской файл в database/factories называется NationalityFactory.php, содержащий следующий код:

use Faker\Generator as Faker;

$factory->define(App\Nationality::class, function (Faker $faker) {
    return [
        'name' => $faker->languageCode,
    ];
});

В NationalitySeeder.php положить следующий код

$nationalities = ['German', 'French', 'etc.'];

factory(App\Nationality::class, count($nationalities))
           ->create()
           ->each(function ($nationality, $key) use ($nationalities) {
                $nationality->name = $nationalities[$key];
            });

Это сделает национальности на основе того, сколько вы настроили в массиве, используя фабрики Laravel.

Другие вопросы по тегам