Sau khi đã đã có CSDL, việc tiếp theo bạn có thể cần làm đó là thêm một số dữ liệu mẫu trước khi bắt đầu thực hiện việc code các tính năng. Như đã nói trên việc các bạn thêm dữ liệu mẫu thủ công tốn rất nhiều công sức và nếu làm viêc team bạn lại mất công export thành file .sql và đưa cho thành viên khác của team nếu không mỗi thành viên lại phải tự tạo dữ liệu thì lại càng mất thời gian. Để giải quyết vấn đề này, Seedẻr cung cấp cho bạn các phương thức đơn giản để tạo ra dữ liệu mẫu bạn cần cho việc phát triển các tính năng.
1. Các file seeder
- Trong một project Laravel các file seeder được lưu trong thư mục
database/seeds
, Nghĩ là khi bạn tạo mới một file seeder thì nó sẽ được lưu hết vào đây. Các file seeder này có nhiệm vụ thêm dữ liệu mẫu vào trong CSDL của bạn sau khi tạo.
- Ban đầu thư mục này sẽ chưa một file tên là
DatabaseSeeder.php
, đây chính là file gốc được chạy khi ta thực hiện lệnh thêm dữ liệu (sẽ được nói ở dưới). Các file seeder nói chung chỉ có duy nhất một function làrun()
, hàm này sẽ dùng để thêm dữ liệu vào CSDL. Nội dung fileDatabaseSeeder.php
:
- Ở trên chính là dữ liệu mẫu mà chúng ta muốn thêm được vào CSDL, tuy nhiên nó vẫn khác là thủ công vì ta vẫn phải gõ tay dữ liệu và thông thường ta sẽ không thêm trực tiếp dữ liệu cho bảng trực tiếp trong file
DatabaseSeeder.php
như thế này mà thay vào đó ta sẽ tạo các file seeder cho từng bảng rồi gọi nó trong fileDatabaseSeeder.php
, cụ thể khi áp dụng cách này file của chúng ta sẽ như sau:
Lưu ý dữ liệu thêm vào CSDL cần được sắp xếp theo đúng thứ tự phù hợp như nếu sử dụng khóa ngoại thì bảng cha cần được chạy trước Lúc này ta sẽ sử dụng hàm call để gọi đến các class Seeder khác dùng cho từng bảng trong CSDL, nội dung các class Seeder này cũng giống như nội dung class DatabaseSeeder.php
ở ảnh trước kia. Ví dụ class UserTableSeeder: Để thêm đồng thời nhiều giữ liệu, ta có thể sử dụng truyền vào nhiều mảng cho hàm insert, tuy nhiên nếu bạn muốn dữ liệu độc đáo hơn và có nhiều lựa chọn hơn cho các dạng email, ngày sinh, tên, đoạn văn thì bạn nên dùng 1 package có sẵn trong Laravel tên là Faker.
2. Tạo các file seeder
- Để tạo các file seeder cho các bảng, ta dùng lệnh:
$ php artisan make:seeder <seeder-class-name>
Sau khi thực hiện lệnh trên sẽ tạo cho ta 1 file và 1 class trong file đó giống với tên mà ta đã đặt ở trên. Bên trong class này cũng có một function run()
rỗng đợi để được chúng ta định nghĩa, giả sử ta tạo dữ liệu mẫu cho bảng users
cùng với 3 cột là name, email, password và muốn tạo 10 bản ghi thì file seeder của chúng ta lúc này sẽ như sau: Ở đây ta đang dùng Faker để tạo dữ liệu mẫu theo từng cột. Tuy nhiên nhìn vào cách làm trên, bạn sẽ thấy nếu muốn tạo dữ liệu nhiều hơn chả nhẽ ta sẽ đi copy đủ số lượng record ta muốn như 100, 1000. Để giải quyết vấn đề này, ta có thể sử dụng khái niệm tên là ModelFactory
. Trong folder database
ta sẽ thấy còn có một folder nữa là factories
, bên trong folder này có 1 file tên là ModelFactory.php
dùng để định nghĩa cấu trúc của dữ liệu mẫu mà ta muốn thêm vào CSDL theo từng bảng: Lưu ý để dùng được model factory thì trước đó ta cần tạo các Model cho các bảng trong CSDL Sau khi định nghĩa cấu trúc của một record nằm trong bảng users
ứng với model User
thì lúc này trong file UserTableSeeder.php
ta có thể sửa lại thành như sau: Như bạn thấy, do chúng ta đã định nghĩa cấu trúc của 1 record cho model User
bằng fatory nên ta chỉ đơn giản dùng cú pháp như trên đi kèm với số lượng bản ghi muốn tạo là xong. Ngắn gọn và hiệu quả hơn nhiều so với việc copy đủ số lượng record trong hàm insert .
3. Chạy filder seeder
- Để tiến hành chạy file seeder và thêm dữ liệu vào CSDL ta thực hiện lệnh sau:
$ php artisan db:seed
Lệnh trên sẽ tiến hành chạy nội dung file DatabaseSeeder.php
theo hàm run được khai báo trong đó. Trong trường hợp bạn muốn chạy một file Seeder cụ thể thì ta thực hiện lệnh sau:
$ php artisan db:seed --class=UserTableSeeder
Sẽ chạy duy nhất file UserTableSeeder