在Laravel工厂,与“生产”有什么区别;“国家”;及;“定义”是什么;?

在Laravel工厂,与“生产”有什么区别;“国家”;及;“定义”是什么;?,laravel,laravel-seeding,Laravel,Laravel Seeding,在拉威尔的工厂里,使用方法state和方法defineAs有什么区别 state只是基本方法的扩展,而defineAs是一个完全不同的定义吗?你能举一些例子让它更容易理解吗 方法状态和定义的用途完全不同 定义和定义 您可以使用define方法为模型注册工厂,该方法由类和回调提供。例如,如果您正在为用户模型创建一个工厂,那么您可以这样注册它: $factory->define(App\User::class, function (Faker $faker) { // set valu

在拉威尔的工厂里,使用方法
state
和方法
defineAs
有什么区别


state
只是基本方法的扩展,而
defineAs
是一个完全不同的定义吗?你能举一些例子让它更容易理解吗

方法
状态
定义
的用途完全不同

定义
定义
您可以使用
define
方法为模型注册工厂,该方法由类和回调提供。例如,如果您正在为
用户
模型创建一个工厂,那么您可以这样注册它:

$factory->define(App\User::class, function (Faker $faker) {
    // set values here
});
factory('user')->make();
$factory->define(App\User::class, function ($faker) {
    return [
        'name' => $faker->name,
        'email' => $faker->email,
        'password' => str_random(10),
        'remember_token' => str_random(10),
        'admin' => false,
    ];
});

$factory->defineAs(App\User::class, 'admin', function ($faker) use ($factory) {
    $user = $factory->raw(App\User::class);

    return array_merge($user, ['admin' => true]);
});
$factory->state(App\User::class, 'address', function ($faker) {
    return [
        'admin' => true,
    ];
});
factory(App\User::class)->states('admin', 'disable')->create()
然后你会这样给工厂打电话:

factory(App\User::class)->make();
但是,有时您可能希望使用名称而不是类来注册工厂,以便可以这样调用工厂:

$factory->define(App\User::class, function (Faker $faker) {
    // set values here
});
factory('user')->make();
$factory->define(App\User::class, function ($faker) {
    return [
        'name' => $faker->name,
        'email' => $faker->email,
        'password' => str_random(10),
        'remember_token' => str_random(10),
        'admin' => false,
    ];
});

$factory->defineAs(App\User::class, 'admin', function ($faker) use ($factory) {
    $user = $factory->raw(App\User::class);

    return array_merge($user, ['admin' => true]);
});
$factory->state(App\User::class, 'address', function ($faker) {
    return [
        'admin' => true,
    ];
});
factory(App\User::class)->states('admin', 'disable')->create()
这就是
defineAs
的作用:
defineAs
接受类(例如:
App\User::class
)和名称。例如:

$factory->define(App\User::class, 'user', function (Faker $faker) {
    // set values here
});
defineAs
没有文档记录,但您可以在中找到它


工厂国家 用于生成具有一组特定属性的模型:

状态允许您定义可应用于模型工厂的任意组合的离散修改

例如,您的
用户
模型可能有一个额外的
is_admin
字段,用于确定用户是否为管理员。您可以创建一个状态,以允许作为管理员的用户通过工厂生成

首先定义您的状态(其中
admin
是名称):

然后,在生成用户时,您将进入
admin
状态:

factory(App\User::class)->states('admin')->make();

这意味着您的
用户
模型可以有一个工厂,支持多种不同类型的用户;您可以在同一工厂内为被禁止的用户或拥有与其帐户关联的图片的用户创建状态。这是非常有益的,因为这意味着开发人员在使用工厂时不需要关心底层结构,并且如果底层结构发生变化(例如:
is\u admin
变成
administrator\u at
)只有工厂需要更改。

之前的答案是
defineAs
类似于别名或简写名称,但它是错误的!如果您做出以下决定:

factory('user')->create(); //it won't work
定义
和状态基本相同,只是略有不同。 在5.2之前的版本中,状态称为状态

因此,在创建模型时,
defineAs
会根据原始模型创建不同的模型类型,以设置如下常见属性:

$factory->define(App\User::class, function (Faker $faker) {
    // set values here
});
factory('user')->make();
$factory->define(App\User::class, function ($faker) {
    return [
        'name' => $faker->name,
        'email' => $faker->email,
        'password' => str_random(10),
        'remember_token' => str_random(10),
        'admin' => false,
    ];
});

$factory->defineAs(App\User::class, 'admin', function ($faker) use ($factory) {
    $user = $factory->raw(App\User::class);

    return array_merge($user, ['admin' => true]);
});
$factory->state(App\User::class, 'address', function ($faker) {
    return [
        'admin' => true,
    ];
});
factory(App\User::class)->states('admin', 'disable')->create()
也在做同样的事情,但方式更好,如下所示:

$factory->define(App\User::class, function (Faker $faker) {
    // set values here
});
factory('user')->make();
$factory->define(App\User::class, function ($faker) {
    return [
        'name' => $faker->name,
        'email' => $faker->email,
        'password' => str_random(10),
        'remember_token' => str_random(10),
        'admin' => false,
    ];
});

$factory->defineAs(App\User::class, 'admin', function ($faker) use ($factory) {
    $user = $factory->raw(App\User::class);

    return array_merge($user, ['admin' => true]);
});
$factory->state(App\User::class, 'address', function ($faker) {
    return [
        'admin' => true,
    ];
});
factory(App\User::class)->states('admin', 'disable')->create()
或者即使没有回调,也只是一个数组:

$factory->state(App\User::class, 'address', [
    'admin' => true,
});
另一个区别是,
define
在对象在数据库中持久化后触发一个调用的事件(afterCreating),而
states
将触发一个事件
afterCreatingState
。 此外,您还可以创建具有以下多种状态的对象:

$factory->define(App\User::class, function (Faker $faker) {
    // set values here
});
factory('user')->make();
$factory->define(App\User::class, function ($faker) {
    return [
        'name' => $faker->name,
        'email' => $faker->email,
        'password' => str_random(10),
        'remember_token' => str_random(10),
        'admin' => false,
    ];
});

$factory->defineAs(App\User::class, 'admin', function ($faker) use ($factory) {
    $user = $factory->raw(App\User::class);

    return array_merge($user, ['admin' => true]);
});
$factory->state(App\User::class, 'address', function ($faker) {
    return [
        'admin' => true,
    ];
});
factory(App\User::class)->states('admin', 'disable')->create()

正确的用法是
factory(User::class,'admin')->make()
,而不是
factory('admin')->make()
@MaksimIvanov你完全正确,但这是他写的<代码>工厂('admin')->make()是您想要做的,而
工厂(User::class,'admin')->make()
是您要做的,我的困惑是关于
->状态&->状态
。谢谢。定义方法在Laravel 7.x中被删除。见: