Laravel5で都道府県のプルダウンをデータベースから取得する（自分用メモ）

何ら難しいことはしていないです。結構やる頻度が多かったので自分で使いまわせるように。

### はじめに

都道府県のプルダウンって、HTMLだとこんな風に作ると思います。

```html
<select name="pref_id">
	<option selected="selected" value="">都道府県</option>
	<option value="1">北海道</option>
	...
	<option value="47">沖縄県</option>
</select>
```

次に、Laravel Collectiveを使用すると、プルダウンは次のようにすると作成できます。

```php
{{ Form::select('pref_id', ['' => '都道府県', '1' => '北海道', ... '47' => '沖縄県'], null, ['class' => 'form', 'id' => 'pref_id']) }}
```

しかし、配列の中身を全部書く人はいないと思うので、
都道府県の部分を次のように変数に格納して都道府県のHTMLタグを生成したいと思います。

```php
{{ Form::select('pref_id', $prefectures, null, ['class' => 'form', 'id' => 'pref_id']) }}
```

### 実装

##### 必要ファイルの作成

```php
php artisan make:model Prefecture
php artisan make:migration create_prefectures
php artisan make:seeder PrefecturesSeeder
```

##### Model

app/Prefecture.php
作った後は何もしない

##### Migration

DBに登録するテーブルの内容を定義します

```php:database/migrations/2016_11_04_000000_create_prefectures.php

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreatePrefectures extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('prefectures', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('code')->default(0); // 都道府県番号(value)
            $table->text('name'); // 都道府県名(name)
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('prefectures');
    }
}

```

##### Seeder

テーブルの中に入れる初期データを登録します

```php:database/seeds/PrefecturesSeeder.php

<?php

use Illuminate\Database\Seeder;

class PrefecturesSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $prefectures = [
            ['code' => 1, 'name' => '北海道'],
            ['code' => 2, 'name' => '青森県'],
            ['code' => 3, 'name' => '岩手県'],
            ['code' => 4, 'name' => '宮城県'],
            ['code' => 5, 'name' => '秋田県'],
            ['code' => 6, 'name' => '山形県'],
            ['code' => 7, 'name' => '福島県'],
            ['code' => 8, 'name' => '茨城県'],
            ['code' => 9, 'name' => '栃木県'],
            ['code' => 10, 'name' => '群馬県'],
            ['code' => 11, 'name' => '埼玉県'],
            ['code' => 12, 'name' => '千葉県'],
            ['code' => 13, 'name' => '東京都'],
            ['code' => 14, 'name' => '神奈川県'],
            ['code' => 15, 'name' => '新潟県'],
            ['code' => 16, 'name' => '富山県'],
            ['code' => 17, 'name' => '石川県'],
            ['code' => 18, 'name' => '福井県'],
            ['code' => 19, 'name' => '山梨県'],
            ['code' => 20, 'name' => '長野県'],
            ['code' => 21, 'name' => '岐阜県'],
            ['code' => 22, 'name' => '静岡県'],
            ['code' => 23, 'name' => '愛知県'],
            ['code' => 24, 'name' => '三重県'],
            ['code' => 25, 'name' => '滋賀県'],
            ['code' => 26, 'name' => '京都府'],
            ['code' => 27, 'name' => '大阪府'],
            ['code' => 28, 'name' => '兵庫県'],
            ['code' => 29, 'name' => '奈良県'],
            ['code' => 30, 'name' => '和歌山県'],
            ['code' => 31, 'name' => '鳥取県'],
            ['code' => 32, 'name' => '島根県'],
            ['code' => 33, 'name' => '岡山県'],
            ['code' => 34, 'name' => '広島県'],
            ['code' => 35, 'name' => '山口県'],
            ['code' => 36, 'name' => '徳島県'],
            ['code' => 37, 'name' => '香川県'],
            ['code' => 38, 'name' => '愛媛県'],
            ['code' => 39, 'name' => '高知県'],
            ['code' => 40, 'name' => '福岡県'],
            ['code' => 41, 'name' => '佐賀県'],
            ['code' => 42, 'name' => '長崎県'],
            ['code' => 43, 'name' => '熊本県'],
            ['code' => 44, 'name' => '大分県'],
            ['code' => 45, 'name' => '宮崎県'],
            ['code' => 46, 'name' => '鹿児島県'],
            ['code' => 47, 'name' => '沖縄県'],
        ];
        DB::table('prefectures')->insert($prefectures);
    }
}

```

作った後、db:seedでデータベースに登録されるようにします

```php:database/seeds/DatabaseSeeder.php

<?php

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $this->call('PrefecturesSeeder');
    }
}

```

### DBにテーブルを登録

```
php artisan migrate
php artisan db:seed
```

### Controllerで変数定義

都道府県の変数を定義してViewで呼び出せるようにします

```php:app/Http/Controllers/ItemsController.php

    public function create(){
        $prefectures = \App\Prefecture::orderBy('code','asc')->pluck('name', 'code');
        $prefectures = $prefectures -> prepend('都道府県', '');

        return view('items.create')->with(['prefectures' => $prefectures]);
    }

```

### Viewで呼び出し

```php:resources/views/index.blade.php
{{ Form::select('pref_id', $prefectures, null, ['class' => 'form', 'id' => 'pref_id']) }}
```

### NHK

完

### 追記

こちらにもっと素敵なやり方が紹介されていました。私はプログラミング初心者なので多分下のやつに従うほうがいいと思います。
http://qiita.com/sakuraya/items/42fffe0f171d49ee74a0#_reference-634af529c0214d77de0b

上記の記事で、都道府県のIDをもとに文字列を取得する方法が紹介されていましたので、データベースでするパターンも書いてみようと思います。

```php:app/Item.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Item extends Model
{
    public function getPrefNameAttribute() {
        return \App\Prefecture::where('code', $this -> pref) -> first() -> name;
    }
}
```

```php:resources/views/index.blade.php
<p>出身地：{{ $item -> prefName }}</p>
```