Seed ไฟล์ sql ใน Laravel Database Seeding

Seeding Laraval Database

Laravel จะมีฟังก์ชั่น Seeding สำหรับทำการ Mockup Data เพื่อเอาไว้ Test หรือเอาไว้สำหรับ เซตค่าเริ่มต้นให้กับระบบเช่น สร้าง Category, User, Province เป็นต้น โดยการ Seeding นั้นสามารถอ่าน Database: Seeding ได้เลย สำหรับใครที่ยังไม่รู้จักเดี๋ยวเรามาพูดถึงในบทความหน้ากันครับ

ทีนี้การ Seeing Database เนี่ยเราก็อาจจะต้องเขียน Seeder หรือ Factory Facker เพื่อทำข้อมูลหลอกๆแต่คราวนี้ถ้าข้อมูลของเราที่ต้องการเพิ่มใน Database เป็นข้อมูลจริงที่ Export ออกมาจาก Database เก่าเราจะต้องใช้วิธี DB::unprepared ซึ่งจะเป็นการนำไฟล์ .sql มาทำการ import ผ่าน Seeder เรามาดูวิธีการกัน

Folder Structure

ขั้นแรกผมนำไฟล์ provinces.sql ใส่ไปที่ folder database\seeds หรือสามารถสร้าง folder sql ด้านนอกก็ได้ตามสะดวกครับจากนั้นทำการสร้างไฟล์ ProvinceTableSeeder.php ผ่านคำสั่ง

php artisan make:seeder ProvinceTableSeeder

จากนั้นในไฟล์ ProvinceTableSeeder ใส่ Code ดังนี้

public function run() {
      DB::unprepared(File::get(database_path('seeds/provinces.sql')));
}

ตรง seeds/provinces.sql ให้ทำการเปลี่ยนเป็น path ที่เราสร้าง folder ไว้ครับ

หลังจากนั้นกลับไปที่ไฟล์ DatabaseSeeder เพื่อทำการ import Class และเรียกใช้งาน ProvinceTableSeeder ตามนี้

<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder {
    public function run() {
        $this->call(ProvinceTableSeeder::class);
    }
}

หลังจากนั้นสามารถสั่งรัน Seeder ด้วยคำสั่ง

php artisan db:seed

หรือจะ Seeding พร้อมกับตอน Migrate Database ก็ได้เช่นเดียวกันด้วยคำสั่ง

php artisan migrate:refresh --seed
// or
php artisan migrate:fresh --seed
// or
php artisan migrate --seed

ปล. หลายคนอาจจะนำ DB::unprepared ไปใส่ที่ไฟล์ DatabaseSeeder.php เลยก็ได้ครับไม่จำเป็นต้องสร้างไฟล์ตามผมก็ได้ แต่ที่ผมทำเพราะบางครั้งเราต้องการ Clean Database หลัง Import จึงต้องสร้าง Class Seeder แยกเพื่อความสะดวกแบบนี้ครับ

ตัวอย่างการ Clean Database หลัง Seeder