Insert database records sử dụng model factories trong Laravel Chuyên mục PHP và Laravel 2023-08-03 1k Lượt xem 52 Lượt thích 0 Bình luận

Một trong nhiều cách mà bạn có thể insert records (hoặc seed database của mình) là sử dụng các class seeder extend dựa trên một lớp có tên là Illuminate\Database\Seeder trong Laravel.
Chẳng hạn, nếu bạn muốn có một seeder cho bảng books , bạn có thể tạo nó bằng cách sử dụng lệnh sau như này.
php artisan make:seeder BookSeeder
Điều này sẽ tạo ra lớp seeder trong thư mục database/seeds như sau.
<?php
use Illuminate\Database\Seeder;
class BookSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
//
}
}
Bây giờ, class chỉ chứa một phương thức gọi là run và đây là nơi bạn có thể viết các truy vấn để insert các bản ghi như vậy.
public function run()
{
DB::table('books')->insert([
'name' => Str::random(10),
'author' => Str::random(10),
'type' => Str::random(10),
]);
}
Bây giờ, bất cứ khi nào bạn chạy seeder, nó sẽ thêm một bản ghi vào bảng books với các giá trị ngẫu nhiên như minh họa ở trên. Điều này ổn nhưng nếu bạn muốn có nhiều bản ghi cho mục đích testing của mình thì sao? Bạn chắc chắn sẽ không lặp lại nhiều truy vấn insert trong quá trình run, phải không?
Và đây là lúc các model factories xuất hiện.
Model Factories
Tóm lại, model factories không có gì ngoài các files PHP (không phải các classes) mà Laravel cho phép bạn set một bộ attributes mặc định cho mỗi Eloquent models của bạn.
Một factory có thể được tạo bằng cách sử dụng lệnh make:factory Artisan. Vì vậy, nếu chúng ta muốn tạo một factory cho model Book của mình, chúng ta có thể tạo nó như này.
php artisan make:factory BookFactory
Điều này sẽ tạo ra một PHP file có tên là BookFactory.php trong thư mục database/factories và nó sẽ giống như này.
<?php
use App\Book;
use Illuminate\Support\Str;
use Faker\Generator as Faker;
$factory->define(Book::class, function (Faker $faker) {
$type = ['fiction', 'nonfiction'];
return [
'name' => $faker->word,
'author' => $faker->name,
'type' => $type[rand(0, (count($type)-1))]
];
});
Như bạn có thể thấy, Laravel cung cấp cho chúng ta thư viện Faker PHP theo ý của chúng ta trong factory definition là Closure.. Tại đây, chúng ta có thể đặt giá trị mặc định cho các thuộc tính bằng cách trả về một mảng thuộc tính bằng thư viện Faker. Sau khi hoàn tất, bây giờ chúng ta có thể sử dụng factory này làm cơ sở cho BookSeeder của mình, trình này sẽ tạo các bản ghi cơ sở dữ liệu bằng cách sử dụng định nghĩa của factory.
Chẳng hạn, nếu bạn muốn tạo, giả sử 20 bản ghi dựa trên factory này, bạn có thể sử dụng nó trong BookSeeder như này.
public function run()
{
factory(App\Book::class, 20)->create()->each(function ($book) {
$book->save(factory(App\Book::class)->make());
});
}
Điều này sẽ tạo ra 20 bản ghi cho bảng books mà không làm lộn xộn code của bạn quá nhiều và cũng dễ bảo trì.
Tất nhiên, bạn cũng có thể đính kèm một relationship ở đây. Vì vậy, nếu chúng ta muốn gắn kết sales relationship, bạn có thể làm như sau.
$book->sales()->save(factory(App\Book::class)->make());


Bình luận (0)