Laravel checkbox複数選択についての挙動

#はじめに
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](https://www.php.net/manual/en/function.serialize.php)してdb保存。
- [unserialize](https://www.php.net/manual/en/function.unserialize.php)して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>
```