#はじめに
Laravelを使っていてcheckboxの挙動でつまずいたので、自分なりの解決策をのせます。
#実現したいこと
- 以前チェックボックスにcheckした項目を
checked
として反映したい。 - checkされた項目は配列としてdb上に格納する。
#つまずいた箇所
最初に実装した方法
更新機能
ProfilesController.php
public function update(UpdateUserProfile $request, $username)
{
$user = $this->getUserByUsername($username);
$input = $request->only(
'location',
'bio',
'twitter_username',
'instagram_username',
'facebook_username',
'selects'
);
if ($user->profile === null) {
$profile = new Profile();
$profile->fill($input);
$user->profile()->save($profile);
} else {
$user->profile->fill($input)->save();
}
$user->save();
return redirect('profile/' . $user->name . '/edit')->with('success');
}
編集画面のcontroller
ProfilesController.php
public function edit($username)
{
try {
$user = $this->getUserByUsername($username);
} catch (ModelNotFoundException $exception) {
abort(404);
}
$data = [
'user' => $user,
];
return view('profile.edit')->with($data);
}
form.blade.php
form.php
<div class="form-group">
<tbody>
<tr>
<th>チェックボックス</th>
<td>
<p>選択(複数可)</p>
<input type="checkbox" name="selects[]" value="web"
{{ in_array("web",$selects,true) ? 'checked="checked"' : ''}}>web
<input type="checkbox" name="selects[]" value="モバイル"
{{ in_array("モバイル",$selects,true) ? 'checked="checked"' : ''}}>モバイル
<input type="checkbox" name="selects[]" value="イラスト"
{{ in_array("イラスト",$selects,true) ? 'checked="checked"' : ''}}>イラスト
<input type="checkbox" name="selects[]" value="モーション"
{{ in_array("モーション",$selects,true) ? 'checked="checked"' : ''}}>モーション
<input type="checkbox" name="selects[]" value="プロダクト"
{{ in_array("プロダクト",$selects,true) ? 'checked="checked"' : ''}}>プロダクト
</td>
</tr>
</tbody>
</div>
単純にname
をselects
という配列にして、それをdatabaseに格納という流れ。
Database周り
- db入って欲しかった内容
["web","モバイル"]
- 実際にdbに格納された内容
["web","\u30e2\u30d0\u30a4\u30eb"]
#解決方法
- serializeしてdb保存。
- unserializeしてview側に反映。
["web","モバイル"]
をserializeするとa:2:{i:0;s:3:"web";i:1;s:12:"モバイル";}
になり配列として保存可能になる。
以上を踏まえて実装
更新機能
ProfilesController.php
public function update(UpdateUserProfile $request, $username)
{
$user = $this->getUserByUsername($username);
$input = $request->only(
'location',
'bio',
'twitter_username',
'instagram_username',
'facebook_username',
'selects'
);
// serializeして格納
+ $input['selects'] = serialize($input['selects']);
if ($user->profile === null) {
$profile = new Profile();
$profile->fill($input);
$user->profile()->save($profile);
} else {
$user->profile->fill($input)->save();
}
$user->save();
return redirect('profile/' . $user->name . '/edit')->with('success');
}
編集画面のcontroller
ProfilesController.php
public function edit($username)
{
try {
$user = $this->getUserByUsername($username);
} catch (ModelNotFoundException $exception) {
abort(404);
}
$data = [
'user' => $user,
// unserialize
+ 'design_skills' => unserialize($user->profile->design_skill)
];
return view('profile.edit')->with($data);
}
form.blade.php
form.php
// form.blade.php
<div class="form-group">
<tbody>
<tr>
<th>チェックボックス</th>
<td>
<p>選択(複数可)</p>
<input type="checkbox" name="selects[]" value="web"
{{ in_array("web",$selects,true) ? 'checked="checked"' : ''}}>web
<input type="checkbox" name="selects[]" value="モバイル"
{{ in_array("モバイル",$selects,true) ? 'checked="checked"' : ''}}>モバイル
<input type="checkbox" name="selects[]" value="イラスト"
{{ in_array("イラスト",$selects,true) ? 'checked="checked"' : ''}}>イラスト
<input type="checkbox" name="selects[]" value="モーション"
{{ in_array("モーション",$selects,true) ? 'checked="checked"' : ''}}>モーション
<input type="checkbox" name="selects[]" value="プロダクト"
{{ in_array("プロダクト",$selects,true) ? 'checked="checked"' : ''}}>プロダクト
</td>
</tr>
</tbody>
</div>