尝试在laravel中运行种子时出错



我正在使用[Nwidart][1]模块包,并试图使用工厂创建一个播种机。但是当我尝试运行php artisan db:seed时,我得到了这个错误

调用未定义的函数Modules\Products\Database\Siders\factory((

这是我的产品DatabaseSeeder.php

<?php
namespace ModulesProductsDatabaseSeeders;
use IlluminateDatabaseSeeder;
use IlluminateDatabaseEloquentModel;
use ModulesProductsModelsProduct;
class ProductsDatabaseSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
Model::unguard();
factory(Product::class, 10)->create();
}
}

我的产品工厂

<?php
/** @var IlluminateDatabaseEloquentFactory $factory */
use FakerGenerator as Faker;
use ModulesProductsModelsProduct;
$factory->define(Product::class, function (Faker $faker) {
return [
'title' => $this->faker->title,
'price' => $this->faker->randomNumber(3),
];
});

我的产品.php

<?php
namespace ModulesProductsModels;
use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateDatabaseEloquentModel;
class Product extends Model
{
use HasFactory;
protected $fillable = [];
}

全错误

Call to undefined function ModulesProductsDatabaseSeedersfactory()
at Modules/Products/Database/Seeders/ProductsDatabaseSeeder.php:25
21▕ 
22▕ 
23▕ 
24▕ 
➜  25▕         $product = factory(Product::class, 10)->create();
26▕ 
27▕ 
28▕     }
29▕ }
+8 vendor frames 
9   database/seeders/DatabaseSeeder.php:20
IlluminateDatabaseSeeder::call()
+24 vendor frames 
34  artisan:37
IlluminateFoundationConsoleKernel::handle()

这是我更换后得到的

factory(Product::class, 10)->create();

Product::factory()->count(10)->create();
Class 'DatabaseFactoriesModulesProductsModelsProductFactory' not found
at vendor/laravel/framework/src/Illuminate/Database/Eloquent/Factories/Factory.php:656
652▕     public static function factoryForModel(string $modelName)
653▕     {
654▕         $factory = static::resolveFactoryName($modelName);
655▕ 
➜ 656▕         return $factory::new();
657▕     }
658▕ 
659▕     /**
660▕      * Specify the callback that should be invoked to guess factory names based on dynamic relationship names.
+1 vendor frames 
2   Modules/Products/Database/Seeders/ProductsDatabaseSeeder.php:25
ModulesProductsModelsProduct::factory()
+8 vendor frames 
11  database/seeders/DatabaseSeeder.php:21
IlluminateDatabaseSeeder::call()

[1]: https://nwidart.com/laravel-modules/v6/introduction

从Laravel 8开始,你可能会使用它——因为你正在使用HasFactory特性——你需要调用

Product::factory()->create()

为了运行工厂

https://laracasts.com/discuss/channels/code-review/please-help-call-to-undefined-function-factory?signup

除了将HasFactory特性添加到模型中之外,为了支持Modules{Module}命名空间,您还需要将其放入模型中:

/**
* Create a new factory instance for the model.
*
* @return IlluminateDatabaseEloquentFactoriesFactory
*/
protected static function newFactory()
{
return ModulesModuleDatabaseFactoriesModelFactory::new();
}

因此,在您的模型Product.php 中

<?php
namespace ModulesProductsModels;
use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateDatabaseEloquentModel;
class Product extends Model
{
use HasFactory;
/**
* Create a new factory instance for the model.
*
* @return IlluminateDatabaseEloquentFactoriesFactory
*/
protected static function newFactory()
{
return ModulesProductsDatabaseFactoriesProductFactory::new();
}
protected $fillable = [];
}     

此外,自拉拉维尔8以来,使用工厂的惯例也发生了变化。所以,在你的

产品数据库种子.php

<?php
namespace ModulesProductsDatabaseSeeders;
use IlluminateDatabaseSeeder;
use IlluminateDatabaseEloquentModel;
use ModulesProductsModelsProduct;
class ProductsDatabaseSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
Model::unguard();
Product::factory()->count(50)->create();
}
}

最后是类似的工厂级ProductFactory.php

<?php
namespace ModulesProductsDatabaseFactories;
use IlluminateDatabaseEloquentFactoriesFactory;
use ModulesProductsModelsProduct;
class ProductFactory extends Factory
{
protected $model = Product::class;
public function definition()
{
return [
'title' => $this->faker->title,
'price' => $this->faker->randomNumber(3),
];
}
}

最新更新