Skip to content

Eloquent: 工厂

简介

在测试应用程序或填充数据库时,你可能需要向数据库插入一些记录。Laravel 允许你使用模型工厂为每个 Eloquent 模型定义一组默认属性,而不是手动指定每列的值。

要查看如何编写工厂的示例,请查看应用程序中的 database/factories/UserFactory.php 文件。此工厂包含在所有新的 Laravel 应用程序中,并包含以下工厂定义:

php
namespace Database\Factories;

use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;

/**
 * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\User>
 */
class UserFactory extends Factory
{
    /**
     * 工厂使用的当前密码。
     */
    protected static ?string $password;

    /**
     * 定义模型的默认状态。
     *
     * @return array<string, mixed>
     */
    public function definition(): array
    {
        return [
            'name' => fake()->name(),
            'email' => fake()->unique()->safeEmail(),
            'email_verified_at' => now(),
            'password' => static::$password ??= Hash::make('password'),
            'remember_token' => Str::random(10),
        ];
    }

    /**
     * 指示模型的邮箱地址应该未验证。
     */
    public function unverified(): static
    {
        return $this->state(fn (array $attributes) => [
            'email_verified_at' => null,
        ]);
    }
}

如你所见,在最基本的形式中,工厂是继承 Laravel 基础工厂类并定义 definition 方法的类。definition 方法返回使用工厂创建模型时应应用的默认属性值集。

通过 fake 辅助函数,工厂可以访问 Faker PHP 库,该库允许你方便地生成各种随机数据用于测试和填充。

NOTE

你可以通过更新 config/app.php 配置文件中的 faker_locale 选项来更改应用程序的 Faker 语言环境。

定义模型工厂

生成工厂

要创建工厂,请执行 make:factory Artisan 命令

shell
php artisan make:factory PostFactory

新的工厂类将被放置在你的 database/factories 目录中。

模型和工厂发现约定

一旦定义了工厂,你可以使用 Illuminate\Database\Eloquent\Factories\HasFactory trait 为模型提供的静态 factory 方法来实例化该模型的工厂实例。

HasFactory trait 的 factory 方法将使用约定来确定分配给该 trait 的模型的正确工厂。具体来说,该方法将在 Database\Factories 命名空间中查找与模型名称匹配并以 Factory 为后缀的工厂类。如果这些约定不适用于你的特定应用程序或工厂,可以向模型添加 UseFactory 属性来手动指定模型的工厂:

php