苗字と名前や始点と終点のように、入力フォームでは2つの入力欄が欲しいけど実際にテーブルにはひとつのカラムで登録したいことがあると思います。
そんな時はリクエストデータは配列で渡すと綺麗に書くことができます
リクエストデータを配列で渡す
formの'user_name'項目を配列で記述をするだけです。
<div class="form-group row">
{!! Form::label('last_name', '氏名(性):', ['class' => 'col-md-4 control-label']) !!}
{!! Form::text('user_name[0]', null, ['class' => 'form-control', 'placeholder' => 'Last Name']) !!}
</div>
<div class="form-group row">
{!! Form::label('first_name', '氏名(名):', ['class' => 'col-md-4 control-label']) !!}
{!! Form::text('user_name[1]', null, ['class' => 'form-control', 'placeholder' => 'First Name']) !!}
</div>
モデルにミューテータの記述
Eloquentはモデルの属性を設定したり取得したりする時に、内容を変更できる便利な方法を提供しています。
ここではミューテータという機能を使い、配列で渡される氏名(性)と氏名(名)を文字列にするしてDBに登録します。
そして、DBからデータを取得する際には配列に変換してモデルに渡しています。
class User extends Model {
protected $fillable = [
'user_name',
];
public function setUserNameAttribute($user_name)
{
$this->attributes['user_name'] = $user_name[0] . '::' . $user_name[1];
}
public function getUserNameAttribute($data)
{
return explode("::", $data);
}
}
モデルのデータをフォーム画面に表示する(編集画面等)
Formのtextメソッドの第2引数に値をDBから取ってきた値を入れます。
(他のフィールドは第2引数をnullにしても、フィールドのnameとモデルのプロパティ名を比較して自動で値を入れてくれるのですが、
配列だと上手くいきません。)
<div class="form-group row">
{!! Form::label('last_name', '氏名(性):', ['class' => 'col-md-4 control-label']) !!}
{!! Form::text('user_name[0]', $user->user_name[0], ['class' => 'form-control', 'placeholder' => 'Last Name']) !!}
</div>
<div class="form-group row">
{!! Form::label('first_name', '氏名(名):', ['class' => 'col-md-4 control-label']) !!}
{!! Form::text('user_name[1]', $user->user_name[1], ['class' => 'form-control', 'placeholder' => 'First Name']) !!}
</div>
まとめ
複数のデータとして扱う場合
DBに登録する際には以下の処理が必要となります。
- 複数のリクエストデータを取得する処理
- それらのデータを加工する処理
- モデル作成時に必要とされる配列に、キーとバリューをを指定してデータを追加する
また、DBに登録した情報をフォームに表示させる際には、以下の処理が必要となります。
4. DBから取得したデータを加工する処理
5. 加工したデータを分割する処理
6. モデルにプロパティを追加し、分割されたデータを追加する処理(__setメソッド)
配列データとして扱う場合
1,2と4,5に関してはミューテータとアクセサーを使って記述することができ、
3.に関しては、リクエストデータのキーは'user_name'で送られ、DBのカラムと同一にできるので、記述の必要ありません。
6.に関しては、直接Formタグに記述する処理をしています($user->user->name[0]の箇所)。
結論
これらを踏まえると、配列を使った場合はモデルでデータを処理しやすくなるので、Controllerが肥大化せず、またコードも綺麗にかけるのではないかと思います。
謝辞
最後まで読んでいただき、まことにありがとうございます。
次の投稿ではLaravelで、配列で渡されたリクエストデータのバリデーションの方法を投稿いたします。