如何在Laravel Seeder和Factory中使用指定预定义数据填充数据表
Laravel 插入预定义GPS地点数据到places表的实现方案
前置说明
假设你的places表对应字段为:custom_id(自定义标识)、district(行政区)、address(地址)、latitude(纬度)、longitude(经度),且对应的App\Models\Place模型已创建,对应字段已加入模型的$fillable属性避免批量赋值报错。
方案一:无需Factory,直接在Seeder中插入预定义数据
适合完全不需要生成伪造测试数据的场景,操作更直接:
- 执行命令生成Seeder文件:
php artisan make:seeder PlaceSeeder - 编辑
database/seeders/PlaceSeeder.php文件,内容如下:
<?php namespace Database\Seeders; use App\Models\Place; use Illuminate\Database\Seeder; class PlaceSeeder extends Seeder { public function run() { // 预定义的地点数据 $places = [ ['custom_id' => 1851, 'district' => 'Long Ridge', 'address' => '3196 High Ridge Rd', 'latitude' => 41.17530211, 'longitude' => -73.56473089000001], ['custom_id' => 1852, 'district' => 'Long Ridge', 'address' => 'Fairway Dr', 'latitude' => 41.17431056, 'longitude' => -73.56484688], ['custom_id' => 1850, 'district' => 'Long Ridge', 'address' => '3143 High Ridge Rd', 'latitude' => 41.17365836, 'longitude' => -73.56433814], ['custom_id' => 1853, 'district' => 'Long Ridge', 'address' => '69 Fairway Dr', 'latitude' => 41.17321183, 'longitude' => -73.56777862], ['custom_id' => 1854, 'district' => 'Long Ridge', 'address' => '137 Fairway Dr', 'latitude' => 41.17195677, 'longitude' => -73.56931346], ['custom_id' => 1849, 'district' => 'Long Ridge', 'address' => '3081 High Ridge Rd', 'latitude' => 41.17156046, 'longitude' => -73.56332694], ['custom_id' => 1857, 'district' => 'Long Ridge', 'address' => '55 Greens Cir', 'latitude' => 41.17155058, 'longitude' => -73.56715740999999], ['custom_id' => 1856, 'district' => 'Long Ridge', 'address' => '10 Greens Cir', 'latitude' => 41.17111036, 'longitude' => -73.56860723], ]; foreach ($places as $place) { Place::create($place); } } }
- 执行Seeder插入数据:
php artisan db:seed --class=PlaceSeeder
如果需要每次执行全量Seeder时自动运行,可在database/seeders/DatabaseSeeder.php的run方法中添加:$this->call(PlaceSeeder::class);
方案二:配合Factory实现
适合后续还需要用Factory生成伪造测试数据的场景:
- 先创建PlaceFactory,执行命令:
php artisan make:factory PlaceFactory - 编辑
database/factories/PlaceFactory.php内容:
<?php namespace Database\Factories; use Illuminate\Database\Eloquent\Factories\Factory; class PlaceFactory extends Factory { public function definition() { return [ // 伪造数据的默认值,后续插入预定义数据时会覆盖 'custom_id' => $this->faker->randomNumber(), 'district' => $this->faker->city(), 'address' => $this->faker->address(), 'latitude' => $this->faker->latitude(), 'longitude' => $this->faker->longitude(), ]; } }
- 修改上述PlaceSeeder中的循环插入逻辑,替换为Factory写法:
foreach ($places as $place) { Place::factory()->create($place); }
运行Seeder的方式和方案一完全一致。
内容的提问来源于stack exchange,提问作者SiriusPhil
相关产品推荐
相关产品推荐

