PHP
CentOS
PostgreSQL
Laravel
laravel5

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

More than 1 year has passed since last update.

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


はじめに

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

<select name="pref_id">

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

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

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

しかし、配列の中身を全部書く人はいないと思うので、

都道府県の部分を次のように変数に格納して都道府県のHTMLタグを生成したいと思います。

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


実装


必要ファイルの作成

php artisan make:model Prefecture

php artisan make:migration create_prefectures
php artisan make:seeder PrefecturesSeeder


Model

app/Prefecture.php

作った後は何もしない


Migration

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


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

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


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でデータベースに登録されるようにします


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で呼び出せるようにします


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で呼び出し


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をもとに文字列を取得する方法が紹介されていましたので、データベースでするパターンも書いてみようと思います。


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;
}
}



resources/views/index.blade.php

<p>出身地{{ $item -> prefName }}</p>