Laravel 6.12 播种厂看不到状态

Laravel 6.12 seeding factory don't see states

像往常一样,该项目需要种子。 和往常一样,我创建了一个 UserFactory,设置它,添加到 DatabasesSeeder 并发现了一个错误。

InvalidArgumentException  : Unable to locate [models] state for [App\Models\User]

但默认工厂(我的意思是 $factory->define(User::class, function (Faker $faker))工作正常

UserTableSeeder.php

use Illuminate\Database\Seeder;
use App\Models\User;

class UserTableSeeder extends Seeder
{
    public function run()
    {
        factory(User::class, 50)->state('models')->create();
        factory(User::class, 50)->create();
    }
}

UserFactory.php

use App\Models\User;
use Faker\Generator as Faker;
use Illuminate\Support\Str;

$factory->define(User::class, function (Faker $faker) {
    //everything works fine here
});

$factory->defineAs(User::class, 'models', function (Faker $faker) {
    //exactly the same return except for a few string values
    //but 'Unable to locate [models] state for [App\Models\User]'
});

好的。我能够在我的环境中重现错误。这就是问题所在。你给你的工厂起了名字 models,但称它为一个州。 $factory->defineAs未记录)没有定义带有状态的工厂,只是为您的工厂命名。 工厂状态命名工厂(您的) 是两个不同的东西。这就是为什么您不能像 State Factory.

那样为您的数据库播种
factory(User::class, 50)->state('models')->create();

如果要使用$factory->defineAs功能,将上面的行替换为

factory(User::class,'models', 50)->create();

(推荐 - 因为它有据可查) 如果您仍然希望能够使用 ->state('models') (states) 为您的数据库播种,则更改你的UserFactory.php如下

use App\Models\User;
use Faker\Generator as Faker;
use Illuminate\Support\Str;

$factory->define(User::class, function (Faker $faker) {
    //everything works fine here
});

$factory->state(User::class, 'models', function (Faker $faker) {
    //exactly the same return except for a few string values
    //but 'Unable to locate [models] state for [App\Models\User]'
});

备注:您现在使用 $factory->state 而不是 $factory->defineAs 来定义您的第二个工厂。