Laravel 中的数据库未使用适当的工厂和播种器 class 进行播种
Database not seeding with proper factories and seeder class in Laravel
问题是我的数据库没有在我的 laravel 项目中使用 php artisan db:seed
播种。没有错误显示,在命令后我的数据库只是空的,但 php artisan db:seed
显示成功结果。
这是我 laravel 项目 database/seeders 文件夹下 DatabaseSeeder.php 文件中的 运行 方法。
$this->call([
ItemBrandSeeder::class,
ItemDepartmentSeeder::class,
ItemUnitSeeder::class,
CategorySeeder::class,
ItemSeeder::class
]);
这是我 laravel 项目 database/seeders 文件夹下 ItemBrandSeeder.php 中的 运行 方法。
ItemBrandFactory::times(100);
这是我在 laravel 项目的 database/factories 文件夹下的 ItemBrandFactory.php 中的定义方法。
return [
'stvalue1' => $this->faker->randomElement(['BOX', 'PCS', 'NOS', 'PACK']),
'stdescription' => $this->faker->text('30'),
'stvalue2' => $this->faker->randomElement(['Countable', 'Measurable']),
'stflag' => "UNIT"
];
这是我 laravel 项目中 database/seeders 文件夹下 ItemDepartmentSeeder.php 中的 运行 方法。
ItemDepartmentFactory::times(25);
这是我在 laravel 项目的 database/factories 文件夹下的 ItemDepartmentFactory.php 中的定义方法。
return [
'stCategory' => $this->faker->text(25),
'sttype' => ['department']
];
这是我 laravel 项目 database/seeders 文件夹下 ItemUnitSeeder.php 中的 运行 方法。
DB::connection("dynamic_db")->table('tblgeneral')->insert([
[
'stflag' => 'UNIT',
'stdescription' => "Pieces",
'stvalue1' => "PCS",
'stvalue2' => "Countable"
],
[
'stflag' => 'UNIT',
'stdescription' => "Box",
'stvalue1' => "BOX",
'stvalue2' => "Countable"
],
[
'stflag' => 'UNIT',
'stdescription' => "Bar",
'stvalue1' => "BAR",
'stvalue2' => "Measurable"
],
[
'stflag' => 'UNIT',
'stdescription' => "Nos",
'stvalue1' => "NOS",
'stvalue2' => "Measurable"
],
[
'stflag' => 'UNIT',
'stdescription' => "Feet",
'stvalue1' => "FT",
'stvalue2' => "Measurable"
],
]);
ItemUnitSeeder 没有工厂 class
这是我 laravel 项目 database/seeders 文件夹下 CategorySeeder.php 中的 运行 方法。
CategoryFactory::times(50);
这是我在 laravel 项目的 database/factories 文件夹下的 CategoryFactory.php 中的定义方法。
return [
'stCategory' => $this->faker->text(25),
'sttype' => ['category']
];
这是我 laravel 项目 database/seeders 文件夹下 ItemSeeder.php 中的 运行 方法。
ItemFactory::times(1000);
这是我在 laravel 项目的 database/factories 文件夹下的 ItemFactory.php 中的定义方法。
$edate = array(\Carbon\Carbon::create('1973-09-17 04:30:43'), \Carbon\Carbon::now())[rand(0, 1)];
$unit2 = array('na', 1, 2, 3, 4, 5)[rand(0, 5)];
$purchasePrice = $this->faker->numberBetween(200, 10000);
$retailPrice = $purchasePrice + ($this->faker->numberBetween(5, 40) / 100 * $purchasePrice);
$minPrice = $retailPrice + $this->faker->numberBetween(0, 50);
$supplierGivenDiscount = $this->faker->numberBetween(0, 10);
$retailDiscount = $this->faker->numberBetween(0, 5);
$unit2Def = $this->faker->numberBetween(2, 12);
$unit2Price = ($retailPrice / $unit2Def) / 100 * rand(1, 50);
$wholesalePrice = $retailPrice - $this->faker->numberBetween(0, 5) / 100 * $retailPrice;
$wholesaleDiscount = $wholesalePrice - $this->faker->numberBetween(0, 3) / 100 * $wholesalePrice;
return [
'stItemCode' => getSerialNo('item'),
'stDescription' => $this->faker->text(100),
'stCategory' => rand(0, 50),
'stUnit1' => rand(0, 5),
'stBrand' => rand(0, 100),
'stDepartment' => rand(0, 25),
'stDescription2' => $this->faker->text(200),
'daEdate' => $edate,
'tiContaminable' => $edate->eq(\Carbon\Carbon::create('1973-09-17 04:30:43')),
'dbMinPrice' => $minPrice,
'dbPurchasePrice' => $purchasePrice,
'dbSupplierGivenDiscount' => $supplierGivenDiscount,
'dbRetailPrice' => $retailPrice,
'dbRetailPriceDiscount' => $retailDiscount,
'stShelf' => rand(0, 30),
'siItemType' => rand(0, 3),
'stUnit2' => $unit2,
'dbUnit2Price' => $unit2 != 'na' ? $unit2Price : 0,
'dbUnit2Def' => $unit2 != 'na' ? $unit2Def : 0,
'dbWholeSalesPrice' => $wholesalePrice,
'dbWholeSalesPriceDiscount' => $wholesaleDiscount,
'dbReorderLevel' => 0,
'stBranch' => Branch::all()->toArray()[rand(0, Branch::count())]['id'],
'stWebUpdateStatus' => 1,
];
控制台中的命令和输出
但是在我的数据库中没有播种数据我的数据库是空的。
如果你想知道为什么我使用 DB class 在 ItemUnitSeeder.php 文件中创建 ItemUnits 因为我只想要 5 个单位所以我想为那个没用的工厂。
类别工厂、项目品牌工厂和项目部门工厂使用相同的table名称称为“tblCategory”,唯一不同的是“sttype”字段。如果“sttype”设置为“category”而不是它的类别,如果它设置为“brand”而不是它的品牌等等。
你的代码是正确的,没有问题,但我认为你的问题出在这里:
而不是使用 times()
使用这样的因素:
Item::factory()->count(1000)->create();
问题是我的数据库没有在我的 laravel 项目中使用 php artisan db:seed
播种。没有错误显示,在命令后我的数据库只是空的,但 php artisan db:seed
显示成功结果。
这是我 laravel 项目 database/seeders 文件夹下 DatabaseSeeder.php 文件中的 运行 方法。
$this->call([
ItemBrandSeeder::class,
ItemDepartmentSeeder::class,
ItemUnitSeeder::class,
CategorySeeder::class,
ItemSeeder::class
]);
这是我 laravel 项目 database/seeders 文件夹下 ItemBrandSeeder.php 中的 运行 方法。
ItemBrandFactory::times(100);
这是我在 laravel 项目的 database/factories 文件夹下的 ItemBrandFactory.php 中的定义方法。
return [
'stvalue1' => $this->faker->randomElement(['BOX', 'PCS', 'NOS', 'PACK']),
'stdescription' => $this->faker->text('30'),
'stvalue2' => $this->faker->randomElement(['Countable', 'Measurable']),
'stflag' => "UNIT"
];
这是我 laravel 项目中 database/seeders 文件夹下 ItemDepartmentSeeder.php 中的 运行 方法。
ItemDepartmentFactory::times(25);
这是我在 laravel 项目的 database/factories 文件夹下的 ItemDepartmentFactory.php 中的定义方法。
return [
'stCategory' => $this->faker->text(25),
'sttype' => ['department']
];
这是我 laravel 项目 database/seeders 文件夹下 ItemUnitSeeder.php 中的 运行 方法。
DB::connection("dynamic_db")->table('tblgeneral')->insert([
[
'stflag' => 'UNIT',
'stdescription' => "Pieces",
'stvalue1' => "PCS",
'stvalue2' => "Countable"
],
[
'stflag' => 'UNIT',
'stdescription' => "Box",
'stvalue1' => "BOX",
'stvalue2' => "Countable"
],
[
'stflag' => 'UNIT',
'stdescription' => "Bar",
'stvalue1' => "BAR",
'stvalue2' => "Measurable"
],
[
'stflag' => 'UNIT',
'stdescription' => "Nos",
'stvalue1' => "NOS",
'stvalue2' => "Measurable"
],
[
'stflag' => 'UNIT',
'stdescription' => "Feet",
'stvalue1' => "FT",
'stvalue2' => "Measurable"
],
]);
ItemUnitSeeder 没有工厂 class 这是我 laravel 项目 database/seeders 文件夹下 CategorySeeder.php 中的 运行 方法。
CategoryFactory::times(50);
这是我在 laravel 项目的 database/factories 文件夹下的 CategoryFactory.php 中的定义方法。
return [
'stCategory' => $this->faker->text(25),
'sttype' => ['category']
];
这是我 laravel 项目 database/seeders 文件夹下 ItemSeeder.php 中的 运行 方法。
ItemFactory::times(1000);
这是我在 laravel 项目的 database/factories 文件夹下的 ItemFactory.php 中的定义方法。
$edate = array(\Carbon\Carbon::create('1973-09-17 04:30:43'), \Carbon\Carbon::now())[rand(0, 1)];
$unit2 = array('na', 1, 2, 3, 4, 5)[rand(0, 5)];
$purchasePrice = $this->faker->numberBetween(200, 10000);
$retailPrice = $purchasePrice + ($this->faker->numberBetween(5, 40) / 100 * $purchasePrice);
$minPrice = $retailPrice + $this->faker->numberBetween(0, 50);
$supplierGivenDiscount = $this->faker->numberBetween(0, 10);
$retailDiscount = $this->faker->numberBetween(0, 5);
$unit2Def = $this->faker->numberBetween(2, 12);
$unit2Price = ($retailPrice / $unit2Def) / 100 * rand(1, 50);
$wholesalePrice = $retailPrice - $this->faker->numberBetween(0, 5) / 100 * $retailPrice;
$wholesaleDiscount = $wholesalePrice - $this->faker->numberBetween(0, 3) / 100 * $wholesalePrice;
return [
'stItemCode' => getSerialNo('item'),
'stDescription' => $this->faker->text(100),
'stCategory' => rand(0, 50),
'stUnit1' => rand(0, 5),
'stBrand' => rand(0, 100),
'stDepartment' => rand(0, 25),
'stDescription2' => $this->faker->text(200),
'daEdate' => $edate,
'tiContaminable' => $edate->eq(\Carbon\Carbon::create('1973-09-17 04:30:43')),
'dbMinPrice' => $minPrice,
'dbPurchasePrice' => $purchasePrice,
'dbSupplierGivenDiscount' => $supplierGivenDiscount,
'dbRetailPrice' => $retailPrice,
'dbRetailPriceDiscount' => $retailDiscount,
'stShelf' => rand(0, 30),
'siItemType' => rand(0, 3),
'stUnit2' => $unit2,
'dbUnit2Price' => $unit2 != 'na' ? $unit2Price : 0,
'dbUnit2Def' => $unit2 != 'na' ? $unit2Def : 0,
'dbWholeSalesPrice' => $wholesalePrice,
'dbWholeSalesPriceDiscount' => $wholesaleDiscount,
'dbReorderLevel' => 0,
'stBranch' => Branch::all()->toArray()[rand(0, Branch::count())]['id'],
'stWebUpdateStatus' => 1,
];
控制台中的命令和输出
但是在我的数据库中没有播种数据我的数据库是空的。
如果你想知道为什么我使用 DB class 在 ItemUnitSeeder.php 文件中创建 ItemUnits 因为我只想要 5 个单位所以我想为那个没用的工厂。
类别工厂、项目品牌工厂和项目部门工厂使用相同的table名称称为“tblCategory”,唯一不同的是“sttype”字段。如果“sttype”设置为“category”而不是它的类别,如果它设置为“brand”而不是它的品牌等等。
你的代码是正确的,没有问题,但我认为你的问题出在这里:
而不是使用 times()
使用这样的因素:
Item::factory()->count(1000)->create();