Seeder là gì?

  • Laravel có một tính năng rất hay là cho phép tạo dữ liệu mẫu một cách tự động, với số lượng nội dung được thêm bất kỳ.
  • Thay vì nhập dữ liệu mẫu bằng tay, thì ta có thể dùng vài dòng lệnh để nhập hàng loạt các dữ liệu mẫu, đặc biệt dữ liệu được tạo có nội dung gần với kiểu giá trị của nó.

Tạo dữ liệu mẫu với seeder

  • Seeder được đặt bên trong thư mục /database/seeders/.
  • Để seeder hoạt động, chúng ta cần kết nối với cơ sở dữ liệu, nếu chưa biết cách kết nối thì bạn xem phần Kết nối database.
  • Xem xét một bảng chưa có dữ liệu news:

Tạo một seeder

  • Để tạo một Seeder mới, ta có thể tạo file trực tiếp bên trong thư mục /database/seeders/, hoặc tạo từ cửa sổ lệnh, mở cửa sổ lệnh cmd, di chuyển tới thư mục myproject bằng lệnh:
cd C:\xampp\htdocs\myproject\

Tạo một seeder

  • Tạo seeder bằng lệnh Artisan: php artisan make:seed tên_seeder
php artisan make:seed ItemsTableSeeder
  • php artisan - Công cụ hỗ trợ viết command line tích hợp sẵn trong Laravel, sẽ còn gặp lại nhiều.
  • make:seed - Lệnh tạo seeder.
  • ItemsTableSeeder - Tên seeder do mình tự đặt.

Dòng lệnh trên thực thi sẽ cho ta kết quả sau:

Tạo một seeder

  • File seeder vừa tạo sẽ được lưu tại thư mục /database/seeders/, có nội dung như sau:
<?php

use Illuminate\Database\Seeder;

class ItemsTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        //
    }
}
  • use Illuminate\Database\Seeder; là khai báo sử dụng cần cho thao tác liên quan đến seeder.
  • Cái chúng ta cần quan tâm là function run()

Bây giờ ta tiến hành tạo dữ liệu mẫu cho bảng news bên trên. Nhìn vào cấu trúc của news, ta thấy có 6 cột: id, created_at, updated_at, headline, email và slug, ta bắt đầu tạo các dữ liệu mẫu cho các cột này theo bên dưới đây.

<?php

use Illuminate\Database\Seeder;

class ItemsTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $fake  = Faker\Factory::create();
        $limit = 10;

        for ($i = 0; $i < $limit; $i++){
            DB::table('news')->insert([
                'title' => $fake->name,
                'created_at' => date("Y-m-d H:i:s"),
                'updated_at' => date("Y-m-d H:i:s"),
                'email' => $fake->unique->email,
                'description' => $fake->sentence(15)
            ]);
        }
    }
}
  • Faker\Factory::create(); Khởi tạo dữ liệu Faker.
  • $limit = 10; tạo 10 record dữ liệu.
  • Sau cùng là chạy vòng lặp for với các giá trị dữ liệu tạo tương ứng insert vào bảng news.
  • Bước trên là bước chuẩn bị sẵn sàng tạo dữ liệu cho bảng news, để tiến hành tạo dữ liệu, ta cần chạy lệnh artisan:
php artisan db:seed --class=ItemsTableSeeder
  • Khi chạy lệnh trên, nếu kết quả xuất hiện thông báo sau là thành công:

Tạo một seeder

  • Kiểm tra bảng news lúc này sẽ thấy có dữ liệu sau:

Tạo một seeder

Một số Faker tạo dữ liệu mẫu

Mục Faker
Title, Name $fake->name
Description $fake->sentence
Content $fake->sentence(500)
Label $fake->randomLetter
Email $fake->unique->email
Tel $fake->phoneNumber
Number $fake->numerify($string = '###')
City $fake->city
Postcode $fake->country
Country $fake->city
Category $fake->numberBetween($min = 1, $max = 2)
Public $fake->boolean()
Image $fake->imageUrl($width = 200, $height = 200)
Date $fake->date("Y-m-d H:i:s")
Slug $fake->rtrim(str_replace('--', '-', strtolower(preg_replace('/[^a-zA-Z0-9]/', '-', trim($fake->sentence(5))))),'-')