Quay lại

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    comment-3 Created with Sketch Beta. 0 Bình luận

Insert database records sử dụng model factories trong Laravel

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)

Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough

Bài viết liên quan

Learning English Everyday