- vừa được xem lúc

Tìm hiểu về Seeder trong Laravel

0 0 39

Người đăng: Hoàng Nguyễn

Theo Viblo Asia

Xin chào anh em, tiếp tục series Laravel và những điều thú vị về nó, hôm nay mình sẽ giới thiệu về Seeder trong Laravel cho các bạn. Như các bạn biết đấy, khi chúng ta tạo xong CSDL(các bạn có thể tham khảo tại bài viết Migration của mình để rõ hơn cách tạo table bằng Migration trong Laravel). Bây giờ chúng ta cần có một số lượng dữ liệu kha khá lớn để hiển thị lên website của chúng ta, thay vì cách nhập tay thủ công thông thường vừa tốn thời gian vừa tốn công thì Laravel hỗ trợ chúng ta Seeder để nhanh chóng tạo dữ liệu , nhanh chóng để phát triển tính năng của chúng ta.

1. Cấu trúc thư mục

Tất cả các seed class được đặt trong thư mục database/seeds. trong thư mục này đã có sẵn file DataTableSeeder.php

<?php use Illuminate\Database\Seeder; class DatabaseSeeder extends Seeder
{ /** * Seed the application's database. * * @return void */ public function run() { // $this->call(UsersTableSeeder::class); }
}

Mặc định trong file này sẽ có class DatabaseSeeder có function run() call tới các seed class khác, cho phép bạn có thể control được thứ tự thêm dữ liệu theo thứ tự bạn sắp xếp.

2. Các cách insert dữ liệu bằng Seeder

Có rất nhiều cách để thêm dữ liệu bằng seeder , sau đây mình xin giới thiệu về một trong những cách đó.

Viết thẳng trong file DataTableSeeder.php

Chúng ta có thể viết trực tiếp trong function run()

<?php use Illuminate\Database\Seeder; class DatabaseSeeder extends Seeder
{ /** * Seed the application's database. * * @return void */ public function run() { DB::table('categories)->insert([ ['name' => 'Điện thoại'], ['name' => 'Laptop'], ['name' => 'Tivi'], ]); }
}

hoặc chúng ta cũng có thể tách riêng ra 1 class và sử dụng hàm hàm call() trong function run().


Lúc này xong , chúng ta sẽ chạy câu lệnh để thực thi chèn dữ liệu vào bảng catgories : php artisan db:seed.

Sử dụng Model Factories

Các bạn thấy sử dụng cách trên nó vẫn còn thủ công, chúng ta phải thêm từng record cho một bảng bằng tay. Thay vì thế, để sinh ra một lượng dữ liệu lớn như 100 records chúng ta sẽ sử dụng Model Factories. Bây giờ các bạn hãy follow theo ví dụ của mình để có thể hiểu thêm về nó nhé.
Ví dụ đặt ra là chúng ta cần tạo 1000 records trong bảng users. 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à UserFactory.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. Trong folder đó có chứa sẵn UserFactory.php

<?php use Faker\Generator as Faker; /*
|--------------------------------------------------------------------------
| Model Factories
|--------------------------------------------------------------------------
|
| This directory should contain each of the model factory definitions for
| your application. Factories provide a convenient way to generate new
| model instances for testing / seeding your application's database.
|
*/ $factory->define(App\User::class, function (Faker $faker) { return [ 'name' => $faker->name, 'email' => $faker->unique()->safeEmail, 'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret 'remember_token' => str_random(10), ];
});

Bây giờ chúng ta tạo 1 file giống ý hệt file này nhưng đổi tên thành SupplierFactory.php hoặc có thể sử dụng terminal để tạo php artisan make:factory SupplierFactory

<?php use Faker\Generator as Faker; $factory->define(App\Models\Supplier::class, function (Faker $faker) { return [ 'name' => $faker->name, 'address' => $faker->address, 'phone' => $faker->phoneNumber, 'email' => $faker->unique()->safeEmail, 'created_at' => new DateTime, 'updated_at' => new DateTime, ];
});

Các bạn sẽ nhìn thấy trong file này nó use Faker\Generator as Faker. Đây là một thư viện fake data rất hữu ích, chúng ta không cần phải nghĩ ra những địa chỉ, những số điện thoại hay email để thêm vào table. Điểu đó đã được thự viện Faker hỗ trợ hết.
Tiếp theo chúng ta sẽ sẽ tạo file seeder : php artisan make:seed SupplierTableSeeder , sau khi ấn enter một file SuplierTableSeeder sễ được sinh ra trong folder database/seeds.

<?php use Illuminate\Database\Seeder; class SuppliersTableSeeder extends Seeder
{ /** * Run the database seeds. * * @return void */ public function run() { factory(App\Models\Supplier::class, 1000)->create(); }
}

Trong function run() chúng ta sẽ sử dụng hàm của helper trong Laravel là hàm factory(). Đối số thứ nhất truyền vào class Model , đối số thứ hai truyền vào số lượng bản ghi muốn sính ra.
Giờ chúng ta vào file DatableSeeder.php trong hàm run() :

<?php use Illuminate\Database\Seeder; class DatabaseSeeder extends Seeder
{ /** * Run the database seeds. * * @return void */ public function run() { $this->call(SuppliersTableSeeder::class); }
} 

Và cuối cùng chạy lệnh php artisan db:seed
Hoặc chúng ta cũng có thể chạy file SupplierTableSeeder.php bằng câu lệnh : php artisan db:seed --class=SupplierTableSeeder

Chú ý!

Để chạy nhiều Seeder ta sẽ tạo nhiều file Seeder rồi gọi chúng trong functionrun() ở file DataTableSeeder.php :

<?php use Illuminate\Database\Seeder; class DatabaseSeeder extends Seeder
{ /** * Run the database seeds. * * @return void */ public function run() { $this->call(UsersTableSeeder::class); $this->call(RolesTableSeeder::class); $this->call(CategoriesTableSeeder::class); $this->call(SuppliersTableSeeder::class); $this->call(ProductsTableSeeder::class); $this->call(ImagesTableSeeder::class); }
}

Các bạn hãy chú ý table nào cần thêm dữ liệu trước để sắp xếp thứ tự trong function run() nhé!!!

3. Kết luận

Bài viết trên nhằm giới thiệu đến các bạn sử dụng Seeder trong Laravel , vừa tiết kiệm thời gian vừa đỡ tốn công. Mọi thắc mắc gì các bạn comment phía dưới nhé. Hẹn gặp lại các bạn ở các bài tiếp theo.

4. Tham khảo

https://laravel.com/docs/5.6/seeding
https://laravel.com/docs/5.6/database-testing#writing-factories
https://github.com/fzaninotto/Faker

Bình luận

Bài viết tương tự

- vừa được xem lúc

Giới thiệu Typescript - Sự khác nhau giữa Typescript và Javascript

Typescript là gì. TypeScript là một ngôn ngữ giúp cung cấp quy mô lớn hơn so với JavaScript.

0 0 525

- vừa được xem lúc

Cài đặt WSL / WSL2 trên Windows 10 để code như trên Ubuntu

Sau vài ba năm mình chuyển qua code trên Ubuntu thì thật không thể phủ nhận rằng mình đã yêu em nó. Cá nhân mình sử dụng Ubuntu để code web thì thật là tuyệt vời.

0 0 396

- vừa được xem lúc

Đặt tên commit message sao cho "tình nghĩa anh em chắc chắn bền lâu"????

. Lời mở đầu. .

1 1 738

- vừa được xem lúc

Tìm hiểu về Resource Controller trong Laravel

Giới thiệu. Trong laravel, việc sử dụng các route post, get, group để gọi đến 1 action của Controller đã là quá quen đối với các bạn sử dụng framework này.

0 0 358

- vừa được xem lúc

Phân quyền đơn giản với package Laravel permission

Như các bạn đã biết, phân quyền trong một ứng dụng là một phần không thể thiếu trong việc phát triển phần mềm, dù đó là ứng dụng web hay là mobile. Vậy nên, hôm nay mình sẽ giới thiệu một package có thể giúp các bạn phân quyền nhanh và đơn giản trong một website được viết bằng PHP với framework là L

0 0 449

- vừa được xem lúc

Bạn đã biết các tips này khi làm việc với chuỗi trong JavaScript chưa ?

Hi xin chào các bạn, tiếp tục chuỗi chủ đề về cái thằng JavaScript này, hôm nay mình sẽ giới thiệu cho các bạn một số thủ thuật hay ho khi làm việc với chuỗi trong JavaScript có thể bạn đã hoặc chưa từng dùng. Cụ thể như nào thì hãy cùng mình tìm hiểu trong bài viết này nhé (go).

0 0 433