何ら難しいことはしていないです。結構やる頻度が多かったので自分で使いまわせるように。
はじめに
都道府県のプルダウンって、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>