Danh sách Tutorial

Laravel Seeding là gì? Đồng bộ dữ liệu dùng Database: Seeding


Ở 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

  1. Khởi tạo dữ liệu ban đầu (init data)
  2. Tạo dữ liệu master
  3. Đồ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' => '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

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

SHARE

mode_edit Bình luận của bạn

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

account_circle
web