【Laravel】都道府県・市町村マスタをSeeder使って作ってみた

<h1>【Laravel】都道府県・市町村マスタをSeeder使って作ってみた</h1>
都道府県マスタと市区町村マスタどっかに落ちてないかな～とググってみましたが、
市区町村まで作成している物が見当たらなかったので、作ってみました！
<font color=red><strong>※使うかどうかの判断は、自己責任でお願いします！※</strong></font>
<font color=red><strong>これOUTじゃね？と思ったらコメントお願いします！</strong></font>


<h2>さっそく現物</h2>

```php:都道府県マスタのテーブル構造
 Schema::create('prefectures', function (Blueprint $table) {
            $table->string('id')->primary();
            $table->string('name')->default('');
            $table->timestamps();
        });
```

```php:市町村マスタのテーブル構造
 Schema::create('cities', function (Blueprint $table) {
            $table->string('id')->primary();
            $table->bigInteger('prefecture_id');
            $table->string('name')->default('');
            $table->timestamps();
        });

```

```php:seeder
 public function run()
    {
        //
        $prefectures = [
            ['id' => '01', 'name' => '北海道'],
            ['id' => '02', 'name' => '青森県'],
            ['id' => '03', 'name' => '岩手県'],
            ['id' => '04', 'name' => '宮城県'],
            ['id' => '05', 'name' => '秋田県'],
            ['id' => '06', 'name' => '山形県'],
            ['id' => '07', 'name' => '福島県'],
            ['id' => '08', 'name' => '茨城県'],
            ['id' => '09', 'name' => '栃木県'],
            ['id' => '10', 'name' => '群馬県'],
            ['id' => '11', 'name' => '埼玉県'],
            ['id' => '12', 'name' => '千葉県'],
            ['id' => '13', 'name' => '東京都'],
            ['id' => '14', 'name' => '神奈川県'],
            ['id' => '15', 'name' => '新潟県'],
            ['id' => '16', 'name' => '富山県'],
            ['id' => '17', 'name' => '石川県'],
            ['id' => '18', 'name' => '福井県'],
            ['id' => '19', 'name' => '山梨県'],
            ['id' => '20', 'name' => '長野県'],
            ['id' => '21', 'name' => '岐阜県'],
            ['id' => '22', 'name' => '静岡県'],
            ['id' => '23', 'name' => '愛知県'],
            ['id' => '24', 'name' => '三重県'],
            ['id' => '25', 'name' => '滋賀県'],
            ['id' => '26', 'name' => '京都府'],
            ['id' => '27', 'name' => '大阪府'],
            ['id' => '28', 'name' => '兵庫県'],
            ['id' => '29', 'name' => '奈良県'],
            ['id' => '30', 'name' => '和歌山県'],
            ['id' => '31', 'name' => '鳥取県'],
            ['id' => '32', 'name' => '島根県'],
            ['id' => '33', 'name' => '岡山県'],
            ['id' => '34', 'name' => '広島県'],
            ['id' => '35', 'name' => '山口県'],
            ['id' => '36', 'name' => '徳島県'],
            ['id' => '37', 'name' => '香川県'],
            ['id' => '38', 'name' => '愛媛県'],
            ['id' => '39', 'name' => '高知県'],
            ['id' => '40', 'name' => '福岡県'],
            ['id' => '41', 'name' => '佐賀県'],
            ['id' => '42', 'name' => '長崎県'],
            ['id' => '43', 'name' => '熊本県'],
            ['id' => '44', 'name' => '大分県'],
            ['id' => '45', 'name' => '宮崎県'],
            ['id' => '46', 'name' => '鹿児島県'],
            ['id' => '47', 'name' => '沖縄県'],
        ];


        Log::info('seeder start');
        $url = 'https://www.land.mlit.go.jp/webland/api/CitySearch';

        for ($i = 1; $i <= 47; $i++) {
            $areaCode = str_pad($i, 2, '0', STR_PAD_LEFT);

            $response = Http::get($url, [
                'area' => $areaCode,
            ]);

            Prefectures::create([
                'id' => $areaCode,
                'name' => $prefectures[array_search($areaCode, array_column($prefectures, 'id'))]['name']
            ]);

            foreach ($response['data'] as $data) {
                City::create([
                    'id' => $data['id'],
                    'prefecture_id' => $areaCode,
                    'name' => $data['name']
                ]);
            }
        }

        Log::info('seeder end');
    }
```

※１　各モデルクラスのコードは省略しています。（〇〇〇::create の〇〇〇の部分）
※２　Log::infoの内容は、storage>logs>laravel.logに書き込まれます。

<h2>ちょっとした説明</h2>
市区町村のデータは、下記APIをたたいて取得してきています。
https://www.land.mlit.go.jp/webland/api/CitySearch
APIの仕様は、[こちら](https://www.land.mlit.go.jp/webland/api.html#todofukenlist)を参照。

都道府県名については、残念ながら上記APIでは取得できないので、致し方なく直書きをしています。
返ってくるデータの内容は下記の通りです。

```json:json
{"status":"OK","data":[{"id":"01100","name":"札幌市"},{"id":"01101","name":"中央区"},～
```

以上！