在Laravel工厂中,“ state”和“ defineAs”有什么区别?

Joh*_*rpa 5 laravel laravel-seeding

在Laravel的工厂中,使用该方法state和方法有defineAs什么区别?

是否state只是基本方法和扩展defineAs一个完全不同的定义是什么?您能否提供一些示例以使其更容易理解?

sam*_*sam 10

方法statedefineAs用途完全不同。

definedefineAs

您可以使用define提供的类和回调方法为模型注册工厂。例如,如果要为User模型创建工厂,则可以像这样注册它:

$factory->define(App\User::class, function (Faker $faker) {
    // set values here
});
Run Code Online (Sandbox Code Playgroud)

然后,您将像这样致电工厂:

factory(App\User::class)->make();
Run Code Online (Sandbox Code Playgroud)

但是,有时您可能希望使用名称而不是类来注册工厂,以便可以这样调用工厂:

factory('user')->make();
Run Code Online (Sandbox Code Playgroud)

这就是defineAs来自于:defineAs接受一个类(如:App\User::class名称。例如:

$factory->define(App\User::class, 'user', function (Faker $faker) {
    // set values here
});
Run Code Online (Sandbox Code Playgroud)

defineAs没有记载,但您可以在雄辩的资料中找到它。


工厂状态

工厂状态用于生成具有特定属性集的模型:

状态允许您定义离散修改,这些离散修改可以以任何组合应用于模型工厂。

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

首先,定义状态(admin名称在哪里):

$factory->state(App\User::class, 'admin', [
    'is_admin' => true,
]);
Run Code Online (Sandbox Code Playgroud)

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

factory(App\User::class)->states('admin')->make();
Run Code Online (Sandbox Code Playgroud)

这意味着您可以为User模型建立一个支持多种不同类型用户的工厂。您可以为所有被禁用户或拥有与其帐户相关联的图片的用户创建状态,这些用户都在同一工厂内。这是额外的好处,因为这意味着开发人员在使用工厂时无需关注基础结构,并且如果基础结构发生更改(例如:is_admin变为administrator_at),则只需更改工厂即可。