Ở bài trước, chúng ta đã đào sâu vào Laravel Migration, một công cụ quan trọng để định nghĩa và xây dựng cấu trúc của cơ sở dữ liệu, từ bảng đến các cột, mối quan hệ và chỉ mục. Trong bài viết này, chúng ta sẽ khám phá tính năng khác của Laravel, được gọi là Laravel Database Seeding. Đây là một công cụ quan trọng giúp xây dựng dữ liệu khởi tạo, đồng bộ dữ liệu giữa các môi trường.
Laravel Seeding là gì?
Trong Laravel, quá trình tạo cơ sở dữ liệu được thực hiện thông qua việc sử dụng các class được định nghĩa sẵn. Laravel sử dụng mã PHP để thực hiện các câu lệnh INSERT, UPDATE, DELETE dựa trên các kịch bản mà bạn đã xây dựng sẵn. Mặc định, Laravel cung cấp sẵn một lớp có tên là DatabaseSeeder cho bạn.
Lớp DatabaseSeeder này là nơi bạn có thể xác định và chạy các phương thức gọi để thực hiện các class khác nhau. Điều này mang lại cho bạn sự linh hoạt trong việc kiểm soát thứ tự thực hiện các tác vụ trong quá trình seeding cơ sở dữ liệu của mình.
Laravel Seeding được sử dụng khi nào?
Đây là các trường hợp mà vinasupport.com thường sử dụng Laravel Seeding
- Khởi tạo dữ liệu ban đầu (init data)
- Tạo dữ liệu master
- Đồng bộ và migrate dữ liệu giữa các môi trường
Hướng dẫn sử dụng Laravel Seeding
Tạo một Database Seeding
Chúng ta tạo một class tương ứng bằng cách sử dụng lệnh artisan
php artisan make:seeder CategorySeeder
Nó sẽ tạo 1 file có đường dẫn thư mục là database/seeders/CategorySeeder.php
Có nội dung code giống như là: (Trên Laravel 9)
<?php namespace DatabaseSeeders; use IlluminateDatabaseConsoleSeedsWithoutModelEvents; use IlluminateDatabaseSeeder; class CategorySeeder extends Seeder { /** * Run the database seeds. */ public function run(): void { // } }
Method run() sẽ là nới chúng ta viết code để xử lý seed dữ liệu database như sau:
<?php namespace DatabaseSeeders; use AppModelsCategory; use CarbonCarbon; use IlluminateDatabaseConsoleSeedsWithoutModelEvents; use IlluminateDatabaseSeeder; class CategorySeeder extends Seeder { /** * Run the database seeds. */ public function run(): void { // Truncate Category::truncate(); // Category data $categories = [ 'Encoders', 'Converters', 'Formatters', 'String Utility', ]; foreach ($categories as $catId => $catTitle) { $insertData[] = [ 'cat_id' => $catId + 1, 'cat_title' => $catTitle, 'cat_name' => Str::slug($catTitle), 'created_at' => Carbon::now(), 'updated_at' => Carbon::now(), ]; } // Seed Categories if (!empty($insertData)) { Category::insert($insertData); } } }
Chạy database seeding
Bảng categories của mình có cấu trúc dữ liệu như sau:
Để chạy file database seeding chúng ta chạy command artisan như sau:
php artisan db:seed --class=CategorySeeder
Kết quả trong bảng ta được dữ liệu như sau:
Chạy nhiều database seeding
Để chạy toàn bộ database seeding cùng 1 lúc, bạn cần tạo nhiều file Seeder. Sau đó đưa chúng vào file mặc định database/seeders/DatabaseSeeder.php
<?php namespace DatabaseSeeders; // use IlluminateDatabaseConsoleSeedsWithoutModelEvents; use IlluminateDatabaseSeeder; class DatabaseSeeder extends Seeder { /** * Seed the application's database. */ public function run(): void { // AppModelsUser::factory(10)->create(); // AppModelsUser::factory()->create([ // 'name' => 'Test User', // 'email' => 'test@example.com', // ]); $this->call(UserSeeder::class); $this->call(CategorySeeder::class); } }
Sau đó chạy command sau:
php artisan db:seed
Migrade và đồng bộ lại toàn bộ dữ liệu.
Kết hợi với Laravel Migration, chúng ta chạy câu lệnh sau. Nó sẽ xóa hết các bảng trong CSDL, tạo lại chúng và đồng bộ dữ liệu từ các Seeder
php artisan migrate:fresh --seed