Ở bài trước chúng ta đã tìm hiểu về Laravel Migration, được sử dụng để nghĩa cấu trúc và tạo cấu trúc các bảng và các cột CSDL, mối quan hệ giữa các bảng, index… Ở bài viết này, chúng ta tìm hiểu 1 tính năng gọi là Laravel Database Seeding, nó được sử dụng để xây dựng dữ liệu khởi tạo, đồng bộ dữ liệu giữa các môi trường.
Các bạn vui lòng tham khảo bài viết trước
Laravel Seeding là gì?
Laravel tạo cơ sở dữ liệu của bạn với dữ liệu bằng cách sử dụng các class được định nghĩa sẵn. Nó sử dụng code PHP để thực hiện các câu lệnh INSERT, UPDATE, DELETE theo kịch bản bạn đã xây dựng sẵn. Theo mặc định, một lớp DatabaseSeeder được định nghĩa trước cho bạn. Từ lớp này, bạn có thể sử dụng phương thức gọi để chạy các class khác nhau, cho phép bạn kiểm soát thứ tự chạy.
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 Database\Seeders; use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Seeder; 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 Database\Seeders; use App\Models\Category; use Carbon\Carbon; use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Seeder; 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 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 { // \App\Models\User::factory(10)->create(); // \App\Models\User::factory()->create([ // 'name' => 'Test User', // 'email' => '[email protected]', // ]); $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
Ngoài ra các bạn vui lòng tham khảo 1 bài viết khác liên quan tới Larvel Seeding trên vinasupport.com
Nguồn: vinasupport.com