Skip to content

Commit 85793fa

Browse files
authored
Merge pull request #68 from zigzagdev/feature/balkans-infra
Fix DB design, Entity, Repository
2 parents b6b6ee6 + 4b60e85 commit 85793fa

10 files changed

Lines changed: 693 additions & 157 deletions

src/app/Models/Country.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class Country extends Model
2121
protected $primaryKey = 'state_party_code';
2222
public $incrementing = false;
2323
protected $keyType = 'string';
24+
public $timestamps = false;
2425

2526
public function worldHeritageSites(): BelongsToMany
2627
{

src/app/Packages/Domains/Test/Repository/WorldHeritageRepository_insertTest.php

Lines changed: 206 additions & 61 deletions
Large diffs are not rendered by default.

src/app/Packages/Domains/Test/WorldHeritageEntityTest.php

Lines changed: 223 additions & 85 deletions
Large diffs are not rendered by default.

src/app/Packages/Domains/WorldHeritageEntity.php

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@ public function __construct(
2323
public ?float $bufferZoneHectares = null,
2424
public ?string $shortDescription = null,
2525
public ?string $imageUrl = null,
26-
public ?string $unescoSiteUrl = null
26+
public ?string $unescoSiteUrl = null,
27+
private array $statePartyCodes = [],
28+
private array $statePartyMeta = []
2729
) {}
2830

2931
public function getId(): ?int
@@ -96,12 +98,12 @@ public function isEndangered(): bool
9698
return $this->isEndangered;
9799
}
98100

99-
public function getLatitude(): float
101+
public function getLatitude(): ?float
100102
{
101103
return $this->latitude;
102104
}
103105

104-
public function getLongitude(): float
106+
public function getLongitude(): ?float
105107
{
106108
return $this->longitude;
107109
}
@@ -120,4 +122,41 @@ public function getUnescoSiteUrl(): ?string
120122
{
121123
return $this->unescoSiteUrl;
122124
}
125+
126+
public function getStatePartyCodes(): array
127+
{
128+
return $this->statePartyCodes;
129+
}
130+
131+
public function getStatePartyMeta(): array
132+
{
133+
return $this->statePartyMeta;
134+
}
135+
136+
public function isTransnational(): bool
137+
{
138+
return count($this->statePartyCodes) > 1;
139+
}
140+
141+
public function getPrimaryStatePartyCode(): ?string
142+
{
143+
foreach ($this->statePartyMeta as $code => $meta) {
144+
if (!empty($meta['is_primary'])) return $code;
145+
}
146+
return $this->statePartyCodes[0] ?? null;
147+
}
148+
149+
public function getStatePartyCodesOrFallback(): array
150+
{
151+
if ($this->statePartyCodes)
152+
return $this->statePartyCodes;
153+
154+
if (!$this->stateParty)
155+
return [];
156+
157+
$parts = preg_split('/[;,\s]+/', strtoupper($this->stateParty));
158+
$codes = array_filter($parts, fn($country) => preg_match('/^[A-Z]{2}$/', $country));
159+
160+
return array_values(array_unique($codes));
161+
}
123162
}

src/app/Packages/Domains/WorldHeritageRepository.php

Lines changed: 99 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ public function insertHeritage(
2626
'longitude' => $entity->getLongitude(),
2727
'is_endangered' => $entity->isEndangered(),
2828
'name_jp' => $entity->getNameJp(),
29-
'state_party' => $entity->getStateParty(),
3029
'criteria' => $entity->getCriteria(),
3130
'area_hectares' => $entity->getAreaHectares(),
3231
'buffer_zone_hectares' => $entity->getBufferZoneHectares(),
@@ -37,8 +36,34 @@ public function insertHeritage(
3736

3837
$heritage = $this->model->create($insertValue);
3938

40-
if (!$heritage) {
41-
throw new Exception('Failed to insert heritage');
39+
$codes = $entity->getStatePartyCodes() ?: $entity->getStatePartyCodesOrFallback();
40+
$codes = array_values(array_unique(array_map('strtoupper', $codes)));
41+
42+
$meta = $entity->getStatePartyMeta();
43+
if (!empty($meta)) {
44+
$payload = [];
45+
foreach ($codes as $code) {
46+
$m = $meta[$code] ?? [];
47+
$payload[$code] = [
48+
'is_primary' => (bool)($m['is_primary'] ?? false),
49+
'inscription_year' => $m['inscription_year'] ?? null,
50+
];
51+
}
52+
$heritage->countries()->sync($payload);
53+
} else {
54+
$heritage->countries()->sync($codes);
55+
}
56+
57+
$heritage->state_party = $code ? implode(', ', $codes) : null;
58+
$heritage->save();
59+
60+
$partyMeta = [];
61+
62+
foreach ($heritage->countries as $country) {
63+
$partyMeta[$country->state_party_code] = [
64+
'is_primary' => (bool) data_get($country, 'pivot.is_primary', false),
65+
'inscription_year' => data_get($country, 'pivot.inscription_year'),
66+
];
4267
}
4368

4469
return new WorldHeritageEntity(
@@ -60,7 +85,9 @@ public function insertHeritage(
6085
bufferZoneHectares: $heritage->buffer_zone_hectares,
6186
shortDescription: $heritage->short_description,
6287
imageUrl: $heritage->image_url,
63-
unescoSiteUrl: $heritage->unesco_site_url
88+
unescoSiteUrl: $heritage->unesco_site_url,
89+
statePartyCodes: $heritage->countries->pluck('state_party_code')->all(),
90+
statePartyMeta: $partyMeta
6491
);
6592
}
6693

@@ -76,4 +103,71 @@ public function insertHeritages(
76103

77104
return $newCollection;
78105
}
79-
}
106+
107+
// public function updateOneHeritage(
108+
// WorldHeritageEntity $entity
109+
// ): WorldHeritageEntity
110+
// {
111+
// $targetEntity = $this->model->find($entity->getUnescoId());
112+
//
113+
// if (!$targetEntity) {
114+
// throw new Exception('Heritage was not found');
115+
// }
116+
//
117+
// $updateValue = [
118+
// 'id' => $entity->getId(),
119+
// 'unesco_id' => $entity->getUnescoId(),
120+
// 'official_name' => $entity->getOfficialName(),
121+
// 'name' => $entity->getName(),
122+
// 'country' => $entity->getCountry(),
123+
// 'region' => $entity->getRegion(),
124+
// 'category' => $entity->getCategory(),
125+
// 'year_inscribed' => $entity->getYearInscribed(),
126+
// 'latitude' => $entity->getLatitude(),
127+
// 'longitude' => $entity->getLongitude(),
128+
// 'is_endangered' => $entity->isEndangered(),
129+
// 'name_jp' => $entity->getNameJp(),
130+
// 'state_party' => $entity->getStateParty(),
131+
// 'criteria' => $entity->getCriteria(),
132+
// 'area_hectares' => $entity->getAreaHectares(),
133+
// 'buffer_zone_hectares' => $entity->getBufferZoneHectares(),
134+
// 'short_description' => $entity->getShortDescription(),
135+
// 'image_url' => $entity->getImageUrl(),
136+
// 'unesco_site_url' => $entity->getUnescoSiteUrl()
137+
// ];
138+
//
139+
// $codes = method_exists($entity, 'getStatePartyCodes')
140+
// ? (array) $entity->getStatePartyCodes()
141+
// : $this->parseStatePartyString((string) $entity->getStateParty());
142+
//
143+
// $updatedHeritage = $this->model->updateOrFail(
144+
// $updateValue
145+
// );
146+
//
147+
// if (!$updatedHeritage) {
148+
// throw new Exception('Failed to update heritage');
149+
// }
150+
//
151+
// return new WorldHeritageEntity(
152+
// id: $updateValue['id'],
153+
// unescoId: $updateValue['unesco_id'],
154+
// officialName: $updateValue['official_name'],
155+
// name: $updateValue['name'],
156+
// country: $updateValue['country'],
157+
// region: $updateValue['region'],
158+
// category: $updateValue['category'],
159+
// yearInscribed: $updateValue['year_inscribed'],
160+
// latitude: $updateValue['latitude'],
161+
// longitude: $updateValue['longitude'],
162+
// isEndangered: $updateValue['is_endangered'],
163+
// nameJp: $updateValue['name_jp'],
164+
// stateParty: $updateValue['state_party'],
165+
// criteria: $updateValue['criteria'],
166+
// areaHectares: $updateValue['area_hectares'],
167+
// bufferZoneHectares: $updateValue['buffer_zone_hectares'],
168+
// shortDescription: $updateValue['short_description'],
169+
// imageUrl: $updateValue['image_url'],
170+
// unescoSiteUrl: $updateValue['unesco_site_url']
171+
// );
172+
// }
173+
}

src/app/Packages/Domains/WorldHeritageRepositoryInterface.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,8 @@ public function insertHeritage(
1111
public function insertHeritages(
1212
WorldHeritageEntityCollection $collection
1313
): WorldHeritageEntityCollection;
14+
15+
// public function updateOneHeritage(
16+
// WorldHeritageEntity $entity
17+
// ): WorldHeritageEntity;
1418
}

src/database/migrations/2025_07_28_195929_create_world_heritage_sites.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public function up(): void
1919
$table->string('name_jp')->nullable();
2020
$table->string('country');
2121
$table->string('region');
22-
$table->string('state_party', 5)->nullable();
22+
$table->string('state_party', 255)->nullable();
2323
$table->enum('category', ['cultural', 'natural', 'mixed']);
2424
$table->json('criteria')->nullable();
2525
$table->year('year_inscribed');

src/database/migrations/2025_08_18_080451_countries.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,6 @@ public function up(): void
2424
*/
2525
public function down(): void
2626
{
27-
//
27+
Schema::dropIfExists('countries');
2828
}
2929
};

src/database/migrations/2025_08_18_080644_site_state_parties.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
public function up(): void
1010
{
1111
Schema::create('site_state_parties', function (Blueprint $table) {
12-
$table->char('state_party_code', 2);
12+
$table->char('state_party_code', 255);
1313

1414
$table->foreignId('world_heritage_site_id')
1515
->constrained('world_heritage_sites')
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
<?php
2+
3+
namespace Database\Seeders;
4+
5+
use Illuminate\Database\Seeder;
6+
use App\Models\Country;
7+
8+
class CountrySeeder extends Seeder
9+
{
10+
public function run(): void
11+
{
12+
$countries = [
13+
['AF','Afghanistan'], ['AL','Albania'], ['DZ','Algeria'], ['AD','Andorra'], ['AO','Angola'],
14+
['AG','Antigua and Barbuda'], ['AR','Argentina'], ['AM','Armenia'], ['AU','Australia'], ['AT','Austria'],
15+
['AZ','Azerbaijan'], ['BS','Bahamas'], ['BH','Bahrain'], ['BD','Bangladesh'], ['BB','Barbados'],
16+
['BY','Belarus'], ['BE','Belgium'], ['BZ','Belize'], ['BJ','Benin'], ['BT','Bhutan'],
17+
['BO','Bolivia'], ['BA','Bosnia and Herzegovina'], ['BW','Botswana'], ['BR','Brazil'], ['BN','Brunei Darussalam'],
18+
['BG','Bulgaria'], ['BF','Burkina Faso'], ['BI','Burundi'], ['CV','Cabo Verde'], ['KH','Cambodia'],
19+
['CM','Cameroon'], ['CA','Canada'], ['CF','Central African Republic'], ['TD','Chad'], ['CL','Chile'],
20+
['CN','China'], ['CO','Colombia'], ['KM','Comoros'], ['CG','Congo'], ['CD','Congo, Democratic Republic of the'],
21+
['CR','Costa Rica'], ['CI',"Cote d'Ivoire"], ['HR','Croatia'], ['CU','Cuba'], ['CY','Cyprus'],
22+
['CZ','Czechia'], ['DK','Denmark'], ['DJ','Djibouti'], ['DM','Dominica'], ['DO','Dominican Republic'],
23+
['EC','Ecuador'], ['EG','Egypt'], ['SV','El Salvador'], ['GQ','Equatorial Guinea'], ['ER','Eritrea'],
24+
['EE','Estonia'], ['SZ','Eswatini'], ['ET','Ethiopia'], ['FJ','Fiji'], ['FI','Finland'],
25+
['FR','France'], ['GA','Gabon'], ['GM','Gambia'], ['GE','Georgia'], ['DE','Germany'],
26+
['GH','Ghana'], ['GR','Greece'], ['GD','Grenada'], ['GT','Guatemala'], ['GN','Guinea'],
27+
['GW','Guinea-Bissau'], ['GY','Guyana'], ['HT','Haiti'], ['HN','Honduras'], ['HU','Hungary'],
28+
['IS','Iceland'], ['IN','India'], ['ID','Indonesia'], ['IR','Iran'], ['IQ','Iraq'],
29+
['IE','Ireland'], ['IL','Israel'], ['IT','Italy'], ['JM','Jamaica'], ['JP','Japan'],
30+
['JO','Jordan'], ['KZ','Kazakhstan'], ['KE','Kenya'], ['KI','Kiribati'], ['KP',"Korea, Democratic People's Republic of"],
31+
['KR','Korea, Republic of'], ['KW','Kuwait'], ['KG','Kyrgyzstan'], ['LA',"Lao People's Democratic Republic"], ['LV','Latvia'],
32+
['LB','Lebanon'], ['LS','Lesotho'], ['LR','Liberia'], ['LY','Libya'], ['LI','Liechtenstein'],
33+
['LT','Lithuania'], ['LU','Luxembourg'], ['MG','Madagascar'], ['MW','Malawi'], ['MY','Malaysia'],
34+
['MV','Maldives'], ['ML','Mali'], ['MT','Malta'], ['MH','Marshall Islands'], ['MR','Mauritania'],
35+
['MU','Mauritius'], ['MX','Mexico'], ['FM','Micronesia, Federated States of'], ['MD','Moldova'], ['MC','Monaco'],
36+
['MN','Mongolia'], ['ME','Montenegro'], ['MA','Morocco'], ['MZ','Mozambique'], ['MM','Myanmar'],
37+
['NA','Namibia'], ['NR','Nauru'], ['NP','Nepal'], ['NL','Netherlands'], ['NZ','New Zealand'],
38+
['NI','Nicaragua'], ['NE','Niger'], ['NG','Nigeria'], ['MK','North Macedonia'], ['NO','Norway'],
39+
['OM','Oman'], ['PK','Pakistan'], ['PW','Palau'], ['PA','Panama'], ['PG','Papua New Guinea'],
40+
['PY','Paraguay'], ['PE','Peru'], ['PH','Philippines'], ['PL','Poland'], ['PT','Portugal'],
41+
['QA','Qatar'], ['RO','Romania'], ['RU','Russian Federation'], ['RW','Rwanda'], ['KN','Saint Kitts and Nevis'],
42+
['LC','Saint Lucia'], ['VC','Saint Vincent and the Grenadines'], ['WS','Samoa'], ['SM','San Marino'], ['ST','Sao Tome and Principe'],
43+
['SA','Saudi Arabia'], ['SN','Senegal'], ['RS','Serbia'], ['SC','Seychelles'], ['SL','Sierra Leone'],
44+
['SG','Singapore'], ['SK','Slovakia'], ['SI','Slovenia'], ['SB','Solomon Islands'], ['SO','Somalia'],
45+
['ZA','South Africa'], ['SS','South Sudan'], ['ES','Spain'], ['LK','Sri Lanka'], ['SD','Sudan'],
46+
['SR','Suriname'], ['SE','Sweden'], ['CH','Switzerland'], ['SY','Syrian Arab Republic'], ['TJ','Tajikistan'],
47+
['TH','Thailand'], ['TL','Timor-Leste'], ['TG','Togo'], ['TO','Tonga'], ['TT','Trinidad and Tobago'],
48+
['TN','Tunisia'], ['TR','Türkiye'], ['TM','Turkmenistan'], ['TV','Tuvalu'], ['UG','Uganda'],
49+
['UA','Ukraine'], ['AE','United Arab Emirates'], ['GB','United Kingdom of Great Britain and Northern Ireland'],
50+
['TZ','Tanzania, United Republic of'], ['US','United States of America'], ['UY','Uruguay'], ['UZ','Uzbekistan'],
51+
['VU','Vanuatu'], ['VE','Venezuela'], ['VN','Viet Nam'], ['YE','Yemen'], ['ZM','Zambia'], ['ZW','Zimbabwe'],
52+
['VA','Holy See'], ['PS','State of Palestine'],
53+
];
54+
55+
$regions = [
56+
'Africa' => [
57+
'DZ','AO','BJ','BF','BI','CV','CM','CF','TD','KM','CG','CD','CI','DJ','EG','GQ','ER','SZ','ET','GA','GM','GH','GN','GW',
58+
'KE','LS','LR','LY','MG','MW','ML','MR','MU','MA','MZ','NA','NE','NG','RW','ST','SN','SC','SL','SO','ZA','SS','SD','TZ','TG','TN','UG','ZM','ZW',
59+
],
60+
'Americas' => [
61+
'AG','AR','BS','BB','BZ','BO','BR','CA','CL','CO','CR','CU','DM','DO','EC','SV','GD','GT','GY','HT','HN','JM','KN','LC','VC','MX','NI','PA','PE','PY','SR','TT','US','UY','VE',
62+
],
63+
'Asia' => [
64+
'AF','AM','AZ','BH','BD','BT','BN','KH','CN','CY','GE','IN','ID','IR','IQ','IL','JO','JP','KZ','KW','KG','LA','LB','MY','MV','MN','MM','NP','KP','KR','OM','PK','PS','PH','QA','SA','SG','LK','SY','TJ','TH','TL','TM','TR','AE','UZ','VN','YE',
65+
],
66+
'Europe' => [
67+
'AD','AL','AT','BY','BE','BA','BG','HR','CZ','DK','EE','FI','FR','DE','GR','HU','IS','IE','IT','LV','LI','LT','LU','MT','MD','MC','ME','NL','MK','NO','PL','PT','RO','RU','SM','RS','SK','SI','ES','SE','CH','UA','GB','VA',
68+
],
69+
'Oceania' => [
70+
'AU','FJ','KI','MH','FM','NR','NZ','PW','PG','WS','SB','TO','TV','VU',
71+
],
72+
];
73+
74+
$nameJp = [
75+
'JP'=>'日本','CN'=>'中国','KR'=>'大韓民国','KP'=>'朝鮮民主主義人民共和国','TW'=> '台湾',
76+
'SG'=>'シンガポール','MY'=>'マレーシア','TH'=>'タイ','VN'=>'ベトナム','PH'=>'フィリピン','ID'=>'インドネシア',
77+
'LA'=>'ラオス','KH'=>'カンボジア','MM'=>'ミャンマー','LK'=>'スリランカ','IN'=>'インド','BD'=>'バングラデシュ',
78+
'IR'=>'イラン','IQ'=>'イラク','IL'=>'イスラエル','JO'=>'ヨルダン','SA'=>'サウジアラビア','AE'=>'アラブ首長国連邦','QA'=>'カタール','KW'=>'クウェート',
79+
'TR'=>'トルコ','KZ'=>'カザフスタン','KG'=>'キルギス','TJ'=>'タジキスタン','TM'=>'トルクメニスタン','MN'=>'モンゴル','PK'=>'パキスタン','NP'=>'ネパール','PS'=>'パレスチナ',
80+
'AF'=>'アフガニスタン','AZ'=>'アゼルバイジャン','AM'=>'アルメニア','LB'=>'レバノン','OM'=>'オマーン','YE'=>'イエメン','BH'=>'バーレーン','MV'=>'モルディブ',
81+
'AL'=>'アルバニア','AT'=>'オーストリア','BE'=>'ベルギー','BA'=>'ボスニア・ヘルツェゴビナ','BG'=>'ブルガリア','HR'=>'クロアチア',
82+
'CZ'=>'チェコ','FR'=>'フランス','DE'=>'ドイツ','IT'=>'イタリア','MK'=>'北マケドニア','PL'=>'ポーランド','RO'=>'ルーマニア',
83+
'SK'=>'スロバキア','SI'=>'スロベニア','ES'=>'スペイン','CH'=>'スイス','UA'=>'ウクライナ','GB'=>'イギリス','IE'=>'アイルランド',
84+
'NL'=>'オランダ','PT'=>'ポルトガル','NO'=>'ノルウェー','SE'=>'スウェーデン','FI'=>'フィンランド','EE'=>'エストニア','LV'=>'ラトビア','LT'=>'リトアニア',
85+
'IS'=>'アイスランド','DK'=>'デンマーク','LI'=>'リヒテンシュタイン','LU'=>'ルクセンブルク','MT'=>'マルタ','MC'=>'モナコ','ME'=>'モンテネグロ','SM'=>'サンマリノ','VA'=>'バチカン','RU'=>'ロシア連邦','GE'=>'ジョージア','CY'=>'キプロス',
86+
'BY'=>'ベラルーシ','GR'=>'ギリシャ','RS'=>'セルビア',
87+
'EG'=>'エジプト','MA'=>'モロッコ','TN'=>'チュニジア','DZ'=>'アルジェリア','ZA'=>'南アフリカ共和国','ET'=>'エチオピア','KE'=>'ケニア','NG'=>'ナイジェリア','GH'=>'ガーナ','SN'=>'セネガル','TZ'=>'タンザニア','UG'=>'ウガンダ','RW'=>'ルワンダ','ZM'=>'ザンビア','ZW'=>'ジンバブエ','CM'=>'カメルーン','CI'=>'コートジボワール','GA'=>'ガボン','GM'=>'ガンビア','GN'=>'ギニア','GW'=>'ギニアビサウ','BI'=>'ブルンジ','BF'=>'ブルキナファソ','BJ'=>'ベナン','CV'=>'カーボベルデ','KM'=>'コモロ','CG'=>'コンゴ共和国','CD'=>'コンゴ民主共和国','DJ'=>'ジブチ','ER'=>'エリトリア','GQ'=>'赤道ギニア','LY'=>'リビア','LR'=>'リベリア','LS'=>'レソト','MG'=>'マダガスカル','MW'=>'マラウイ','ML'=>'マリ','MR'=>'モーリタニア','MU'=>'モーリシャス','MZ'=>'モザンビーク','NA'=>'ナミビア','NE'=>'ニジェール','SC'=>'セーシェル','SL'=>'シエラレオネ','SO'=>'ソマリア','SS'=>'南スーダン','SD'=>'スーダン','TG'=>'トーゴ',
88+
'US'=>'アメリカ合衆国','CA'=>'カナダ','MX'=>'メキシコ','AR'=>'アルゼンチン','BR'=>'ブラジル','CL'=>'チリ','CO'=>'コロンビア','PE'=>'ペルー','BO'=>'ボリビア','PY'=>'パラグアイ','UY'=>'ウルグアイ','VE'=>'ベネズエラ','EC'=>'エクアドル','CR'=>'コスタリカ','PA'=>'パナマ','CU'=>'キューバ','DO'=>'ドミニカ共和国','DM'=>'ドミニカ国','HT'=>'ハイチ','HN'=>'ホンジュラス','NI'=>'ニカラグア','SV'=>'エルサルバドル','GT'=>'グアテマラ','GY'=>'ガイアナ','SR'=>'スリナム','BS'=>'バハマ','BB'=>'バルバドス','BZ'=>'ベリーズ','GD'=>'グレナダ','JM'=>'ジャマイカ','KN'=>'セントクリストファー・ネーヴィス','LC'=>'セントルシア','VC'=>'セントビンセントおよびグレナディーン諸島','TT'=>'トリニダード・トバゴ',
89+
'AU'=>'オーストラリア','NZ'=>'ニュージーランド','PG'=>'パプアニューギニア','FJ'=>'フィジー','WS'=>'サモア','SB'=>'ソロモン諸島','TO'=>'トンガ','TV'=>'ツバル','VU'=>'バヌアツ','FM'=>'ミクロネシア連邦','MH'=>'マーシャル諸島','PW'=>'パラオ','KI'=>'キリバス','NR'=>'ナウル',
90+
];
91+
92+
$regionByCode = [];
93+
foreach ($regions as $regionName => $codes) {
94+
foreach ($codes as $code) {
95+
$regionByCode[$code] = $regionName;
96+
}
97+
}
98+
99+
$rows = array_map(function ($c) use ($regionByCode, $nameJp) {
100+
$code = $c[0];
101+
return [
102+
'state_party_code' => $code,
103+
'name_en' => $c[1],
104+
'name_jp' => $nameJp[$code] ?? null,
105+
'region' => $regionByCode[$code] ?? null,
106+
];
107+
}, $countries);
108+
109+
Country::query()->upsert(
110+
$rows,
111+
['state_party_code'],
112+
['name_en','name_jp','region']
113+
);
114+
}
115+
}

0 commit comments

Comments
 (0)