Search code examples
phplaravellaravel-5seedinglaravel-seeding

Laravel Factories and Seeding: Static array of arrays


For some of my tables, I'd like to insert a fixed amount of rows with specific data.

This is my categories factory:

$factory->define(Category::class, function (Faker $faker) {
    return [
        [
            'name' => 'Politics',
            'slug' => 'politics',
            'description' => 'To discuss politics'
        ],
        [
            'name' => 'News and Events',
            'slug' => 'news',
            'description' => 'To discuss news and world events'
        ],
        [
            'name' => 'Food and Cooking',
            'slug' => 'cooking',
            'description' => 'To discuss cooking and food'
        ],
        [
            'name' => "Animals and Nature",
            'slug' => 'animals-nature',
            'description' => 'To discuss politics'
        ]
    ];
});

This is the seeder:

public function run() {
   factory(App\Category::class, 1)->create();
}

I get this error: preg_match() expects parameter 2 to be string, array given

Is there a way to insert a fixed amount of static information into certain tables using seeding and factories?


Solution

  • I think you want to use Seeder with static values, if I am correct you should use

    Define Category seeder

    <?php
    use Illuminate\Database\Seeder;
    use App\Category;
    
    class CategorySeeder extends Seeder
    {
        /**
         * Run the database seeds.
         *
         * @return void
         */
        public function run()
        {
            $categories = [
                 [
                'name' => 'Politics',
                'slug' => 'politics',
                'description' => 'To discuss politics'
            ],
            [
                'name' => 'News and Events',
                'slug' => 'news',
                'description' => 'To discuss news and world events'
            ],
            [
                'name' => 'Food and Cooking',
                'slug' => 'cooking',
                'description' => 'To discuss cooking and food'
            ],
            [
                'name' => "Animals and Nature",
                'slug' => 'animals-nature',
                'description' => 'To discuss politics'
            ]
            ];
    
            foreach ($categories as $category) {
                Category::create($category);
            }
        }
    }
    

    And in DatabaseSeeder

    <?php
    
    use Illuminate\Database\Seeder;
    
    class DatabaseSeeder extends Seeder
    {
        /**
         * Seed the application's database.
         *
         * @return void
         */
        public function run()
        {
            $this->call(CategorySeeder::class);
        }
    }
    

    Now run php artisan db:seed and it will be done.