Laravelでユーザーごとにセレクトボックスの内容を変える

ユーザーごとに選択肢が変わるセレクトボックスを作ったので、そのメモとして。

#前提
バージョン：Laravel6
データベース構成：usersとitemsをuser_idで紐づけ

```sql:users
id|name
```
```sql:items
id|user_id|name
```

データベースの中身は冗長なのでページ下部に記載

#実装方法
##①選択肢の抽出
controller側でログイン中のuserのidを取得して、選択肢を抽出する。
sellectionsには連想配列でitemのidとnameを紐づけておく。
抽出条件を変えればより複雑な条件分岐もできそう。

```php:SelectboxController.php
public function selectbox() {
    // ログイン中のユーザーを取得
    // findOrFail使用のためゲストや存在しないidの場合は404エラー
    $user = User::findOrFail(\Auth::id());

    // user_idでitemを抽出
    $items = Item::where('user_id', $user->id)->get();
    // 抽出したitemから選択肢を作成
    $selections = [];
    foreach($items as $item) {
        $selections[$item->id] = $item->name;
    }

    // viewを出力
    return view('selectbox',[
        'user' => $user,
        'selections' => $selections
    ]);
}
```
```html:selectbox.blade.php
<p>{{ $user->name }}としてログイン</p>

// Laravel collectiveを使う場合
{!! Form::open(['route' => 'selectboxResult', 'method' => 'post']) !!}
    {!! Form::label('selection', '選択肢') !!}
    {!! Form::select('selection', $selections) !!}
    {!! Form::submit('送信') !!}
{!! Form::close() !!}

// パッケージを使わない場合
<form method="post" action="{{ route('selectboxResult') }}" accept-charset="UTF-8">
    {{ csrf_field() }}
    <label for="selection">選択肢</label>
    <select id="selection" name="selection">
        @foreach($selections as $itemId => $itemName)
            <option value="{{ $itemId }}">{{ $itemName }}</option>
        @endforeach
    </select>        
    <input type="submit" value="送信">
</form>
```
```php:web.php
Route::get('/selectbox', 'SelectboxController@selectbox')->name('selectbox');
```

##②送信結果の表示
optionタグでitemのidを送信しているので、controllerでidから抽出する。

```php:SelectboxController.php
public function selectboxResult(Request $request) {
    // idからitemを抽出
    $item = Item::findOrFail($request->selection);

    //viewを出力
    return view('selectboxResult',[
        'item' => $item
    ]);
}
```html:selectboxResult.blade.php
<p>idは{{ $item->id }}</p>
<p>名称は{{ $item->name }}</p>
```
```php:web.php
Route::post('/selectbox/result', 'SelectboxController@selectboxResult')->name('selectboxResult');
```

##③実行結果
user1でログインしている場合
![user1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1401303/5249aab1-86b8-2813-4b53-58ec0999695d.gif)
user7でログインしている場合
![user7.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1401303/d7268fe9-e1c6-a475-25c1-9f12b491ebe8.gif)

#サンプルコード全文
```php:SelectBoxController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\User;
use App\Item;

class SelectboxController extends Controller
{
public function selectbox() {
    // ログイン中のユーザーを取得
    // findOrFail使用のためゲストや存在しないidの場合は404エラー
    $user = User::findOrFail(\Auth::id());

    // user_idでitemを抽出
    $items = Item::where('user_id', $user->id)->get();
    // 抽出したitemから選択肢を作成
    $selections = [];
    foreach($items as $item) {
        $selections[$item->id] = $item->name;
    }

    // viewを出力
    return view('selectbox',[
        'user' => $user,
        'selections' => $selections
    ]);
}

    public function selectboxResult(Request $request) {
        // idからitemを抽出
        $item = Item::findOrFail($request->selection);

        //viewを出力
        return view('selectboxResult',[
            'item' => $item
        ]);
    }
}
```

```html:selectbox.blade.php
<!DOCTYPE html>

<html lang="ja">

<head>
    <meta charset="utf-8">
    <title>selectbox</title>
</html>

<body>

    <p>{{ $user->name }}としてログイン</p>

    {!! Form::open(['route' => 'selectboxResult', 'method' => 'post']) !!}
        {!! Form::label('selection', '選択肢') !!}
        {!! Form::select('selection', $selections) !!}
        {!! Form::submit('送信') !!}
    {!! Form::close() !!}

    <form method="post" action="{{ route('selectboxResult') }}" accept-charset="UTF-8">
        {{ csrf_field() }}
        <label for="selection">選択肢</label>
        <select id="selection" name="selection">
            @foreach($selections as $itemId => $itemName)
                <option value="{{ $itemId }}">{{ $itemName }}</option>
            @endforeach
        </select>        
        <input type="submit" value="送信">
    </form>

</body>

</html>
```

```html:selectboxResult.blade.php
<!DOCTYPE html>

<html lang="ja">

<head>
    <meta charset="utf-8">
    <title>selectboxResult</title>
</html>

<body>

    <p>idは{{ $item->id }}</p>
    <p>名称は{{ $item->name }}</p>

</body>

</html>
```
```php:web.php
<?php
Route::get('/selectbox', 'SelectboxController@selectbox')->name('selectbox');
Route::post('/selectbox/result', 'SelectboxController@selectboxResult')->name('selectboxResult');
```

データベースの中身

```sql:users
SELECT * FROM users;
id|name
1|user1
2|user2
3|user3
4|user4
5|user5
6|user6
7|user7
8|user8
9|user9
10|user10
```

```sql:items
SELECT * FROM items;
id|user_id|name
1|9|item1
2|2|item2
3|6|item3
4|4|item4
5|6|item5
6|9|item6
7|8|item7
8|1|item8
9|3|item9
10|5|item10
11|1|item11
12|9|item12
13|10|item13
14|4|item14
15|2|item15
16|7|item16
17|7|item17
18|10|item18
19|3|item19
20|10|item20
21|2|item21
22|9|item22
23|7|item23
24|2|item24
25|4|item25
26|1|item26
27|5|item27
28|2|item28
29|4|item29
30|3|item30
```