最初发表在我的博客,briandouglas.ie
这是有关如何在数据库中添加按省份分组的爱尔兰县的分步指南。
第 1 步 - 省份迁移
php artisan make:迁移create_provinces_table
我们只需要一个省份的名称。
schema::create('provinces', function (blueprint $table) {
$table->id();
$table->string('name');
$table->timestamps();
});
第 2 步 - 县迁移
php artisan make:migration create_counties_table
除了名称之外,县还将包含对其所属省份的引用。
schema::create('counties', function (blueprint $table) {
$table->id();
$table->string('name');
$table->foreignidfor(province::class);
$table->timestamps();
});
第 3 步 - 省份模型
php artisan make:模型省
这里我们添加 name 作为可填写的属性,并与 county 建立 hasmany 关系。
<?php namespace appmodels;
use illuminatedatabaseeloquentfactorieshasfactory;
use illuminatedatabaseeloquentmodel;
use illuminatedatabaseeloquentrelationshasmany;
class province extends model
{
use hasfactory;
protected $fillable = ['name'];
public function counties(): hasmany
{
return $this->hasmany(county::class);
}
}
第 4 步 - 县模型
php artisan make:模型县
这里我们添加name和province_id作为可填写属性,并与province建立belongsto关系。
<?php namespace appmodels;
use illuminatedatabaseeloquentfactorieshasfactory;
use illuminatedatabaseeloquentmodel;
use illuminatedatabaseeloquentrelationsbelongsto;
class county extends model
{
use hasfactory;
protected $fillable = ['name', 'province_id'];
public function province(): belongsto
{
return $this->belongsto(province::class);
}
}
第 5 步 - 省份播种者
php artisan make:seeder provinceseeder
provinceseeder 将为爱尔兰每个省创建记录,并附上相关县。
<?php namespace DatabaseSeeders;
use AppModelsProvince;
use IlluminateDatabaseConsoleSeedsWithoutModelEvents;
use IlluminateDatabaseSeeder;
class ProvinceSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
$irishCounties = [
'Leinster' => [
'Carlow',
'Cavan',
'Dublin',
'Kildare',
'Kilkenny',
'Laois',
'Longford',
'Louth',
'Meath',
'Offaly',
'Westmeath',
'Wexford',
'Wicklow'
],
'Munster' => [
'Clare',
'Cork',
'Kerry',
'Limerick',
'Tippperary',
'Waterford'
],
'Connacht' => [
'Galway',
'Leitrim',
'Mayo',
'Roscommon',
'Sligo'
],
'Ulster' => [
'Antrim',
'Armagh',
'Cavan',
'Derry',
'Donegal',
'Down',
'Fermanagh',
'Monaghan',
'Tyrone'
]
];
foreach ($irishCounties as $provinceName => $countyNames) {
$province = Province::firstOrCreate(['name' => $provinceName]);
foreach ($countyNames as $countyName) {
$province->counties()->firstOrCreate(['name' => $countyName]);
}
}
}
}
第 6 步 - 运行播种机
php artisan db:seed --class=provinceseeder
由于省份和县不会改变,所以播种器只需要运行一次。