백엔드/laravel

seeder 로 data 를 삽입하는 방법

janggos 2024. 1. 13. 19:04

1. 컬렉션 사용해 테이터 삽입

    database\seeders\PostSeeder.php
    -------------------------------
    namespace Database\Seeders;

    use App\Models\Post;
    use Illuminate\Database\Console\Seeds\WithoutModelEvents;
    use Illuminate\Database\Seeder;

    class PostSeeder extends Seeder
    {
        /**
        * Run the database seeds.
        */
        public function run(): void
        {
            $posts = collect([
                [
                    'title' => 'Post One',
                    'slug' => 'post-one',
                    'excerpt' => 'Excerpt of Post One',
                    'description' => 'Description of Post One',
                    'is_published' => true,
                    'min_to_read' => 2
                ],
                [
                    'title' => 'Post Two',
                    'slug' => 'post-two',
                    'excerpt' => 'Excerpt of Post Two',
                    'description' => 'Description of Post Two',
                    'is_published' => true,
                    'min_to_read' => 2,
                ]
            ]);

            $posts->each(function ($post) {
                Post::create($post); <= created_at 및 updated_at 있을 경우 자동 생성 (O)
                Post::insert($post); <= created_at 및 updated_at 있을 경우 자동 생성 (X)
            });
        }
    }

    
    database\seeders\DatabaseSeeder.php
    -----------------------------------
    namespace Database\Seeders;

    // use Illuminate\Database\Console\Seeds\WithoutModelEvents;
    use Illuminate\Database\Seeder;

    class DatabaseSeeder extends Seeder
    {
        /**
        * Seed the application's database.
        */
        public function run(): void
        {
            $this->call(PostSeeder::class);
        }
    }

   실행 1
   php artisan db:seed;

   실행 2
   php artisan migrate:refresh --seed;



2. Json 파일을 사용해 데이터 입력
   임의의 데이터를 database\json\post.json 파일 생성[
    [
        {
            "title": "Post One through Seeder",
            "slug": "post-one-through-seeder",
            "excerpt": "Just a Excerpt..",
            "description": "Just a Description..",
            "is_published": true,
            "min_to_read": 4
        },
        {
            "title": "Post Two through Seeder",
            "slug": "post-two-through-seeder",
            "excerpt": "Just a Excerpt..",
            "description": "Just a Description..",
            "is_published": true,
            "min_to_read": 4
        }
    ]


    database\seeders\PostSeeder.php
    -------------------------------
    namespace Database\Seeders;

    use App\Models\Post;
    use Illuminate\Database\Console\Seeds\WithoutModelEvents;
    use Illuminate\Database\Seeder;
    use Illuminate\Support\Facades\File;

    class PostSeeder extends Seeder
    {
        /**
        * Run the database seeds.
        */
        public function run(): void
        {
            $json = File::get(path: 'database/json/posts.json');
            $posts = collect(json_decode($json));

            $posts->each(function ($post) {
                Post::insert([
                    "title" => $post->title,
                    "slug" => $post->slug,
                    "excerpt" => $post->excerpt,
                    "description" => $post->description,
                    "is_published" => $post->is_published,
                    "min_to_read" => $post->min_to_read
                ]);
            });
        }
    }    

    실행
    php artisan migrate:refresh --seed;


3. 여러 시더 호출

    database\seeders\DatabaseSeeder.php
    -----------------------------------

    namespace Database\Seeders;

    // use Illuminate\Database\Console\Seeds\WithoutModelEvents;
    use Illuminate\Database\Seeder;

    class DatabaseSeeder extends Seeder
    {
        /**
        * Seed the application's database.
        */
        public function run(): void
        {
            $this->call([
                PostsTableSeeder::class,
                UsersTableSeeder::class
            ]);
        }
    }

    실행
    php artisan migrate:refresh --seed