タイトル: Selectの結果の最初もしくは最後に任意の値を追加する方法
SEOタイトル: Laravel コレクション先頭/末尾追加完全ガイド|select 結果に「選択してください」を加える
この本文には実行可能なタグ等が含まれるため、安全のためHTMLソースとして表示しています。本文データは変更していません。
<table border="1" cellpadding="6" cellspacing="0" style="border-collapse:collapse;background:#fffbea;border:1px solid #f4c430;margin:1em 0;width:100%"><tr><td style="background:#f4c430;color:#000;font-weight:bold;padding:8px">この記事の要点</td></tr><tr><td style="padding:10px"><ul><li><strong>先頭に追加</strong>: <code>$collection->prepend($value, $key)</code></li><li><strong>末尾に追加</strong>: <code>$collection->push($value)</code> または <code>put($key, $value)</code></li><li><strong>結合</strong>: <code>$collection->concat([...])</code> / <code>merge([...])</code></li><li>HTML <code><select></code> の先頭に「選択してください」を入れる定番パターン</li><li>Eloquent + Collection で<strong>連想配列 (id => name)</strong> を作るときは <code>pluck()</code> → <code>prepend()</code></li></ul></td></tr></table>
<h2>結論: select 用配列の作り方</h2>
<p>Laravel で <code><select></code> のオプション一覧を作るとき、先頭に「選択してください」のような空オプションを入れたいケースは頻出。コレクションの <code>prepend()</code> を使うのが定石です:</p>
<pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-php">use App\Models\Category;
// id => name の連想配列を取得
$categories = Category::pluck('name', 'id');
// [1 => '雑貨', 2 => '食品', 3 => '家電']
// 先頭に「選択してください」を追加
$options = $categories->prepend('-- 選択してください --', '');
// ['' => '-- 選択してください --', 1 => '雑貨', 2 => '食品', 3 => '家電']
// Blade で使う
// {{ Form::select('category_id', $options, null, ['class' => 'form-control']) }}</code></pre>
<h2>Collection の追加系メソッド一覧</h2>
<table border="1" cellpadding="6" cellspacing="0" style="border-collapse:collapse;width:100%">
<thead><tr style="background:#e3f2fd"><th>メソッド</th><th>位置</th><th>キー指定</th><th>例</th></tr></thead>
<tbody>
<tr><td><code>prepend($value, $key = null)</code></td><td><strong>先頭</strong></td><td>可</td><td>$c->prepend('A', 0)</td></tr>
<tr><td><code>push($value)</code></td><td><strong>末尾</strong></td><td>不可(自動採番)</td><td>$c->push('Z')</td></tr>
<tr><td><code>put($key, $value)</code></td><td>末尾(または上書き)</td><td>必須</td><td>$c->put('z', 'Z')</td></tr>
<tr><td><code>add($value)</code></td><td>末尾</td><td>不可</td><td>$c->add('Z')</td></tr>
<tr><td><code>concat($source)</code></td><td>末尾に結合</td><td>キー振り直し</td><td>$c->concat([10, 20])</td></tr>
<tr><td><code>merge($items)</code></td><td>末尾結合(キー保持)</td><td>同キーは上書き</td><td>$c->merge(['a' => 1])</td></tr>
<tr><td><code>union($items)</code></td><td>末尾結合(既存優先)</td><td>同キーは無視</td><td>$c->union(['a' => 9])</td></tr>
</tbody>
</table>
<h2>prepend の使い方</h2>
<pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-php">use Illuminate\Support\Collection;
$c = collect([1 => 'A', 2 => 'B', 3 => 'C']);
// キー指定なし(自動で 0 番)
$c->prepend('Z');
// [0 => 'Z', 1 => 'A', 2 => 'B', 3 => 'C']
// キー指定あり
$c->prepend('Z', 'zero');
// ['zero' => 'Z', 1 => 'A', 2 => 'B', 3 => 'C']
// 空文字キーで select 用先頭に
$c->prepend('選択してください', '');
// ['' => '選択してください', 1 => 'A', 2 => 'B', 3 => 'C']</code></pre>
<h2>push / put / add の違い</h2>
<pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-php">$c = collect(['a' => 1, 'b' => 2]);
// push : 末尾に追加。キー指定不可(連番)
$c->push(99);
// ['a' => 1, 'b' => 2, 0 => 99]
// add : push と同等(メソッド名違いの別名)
$c->add(99);
// put : キー指定必須。同じキーがあれば上書き
$c->put('c', 3);
// ['a' => 1, 'b' => 2, 'c' => 3]
$c->put('a', 999); // 上書き
// ['a' => 999, 'b' => 2, ...]</code></pre>
<h2>concat / merge / union の違い</h2>
<pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-php">$a = collect(['x' => 1, 'y' => 2]);
$b = ['y' => 20, 'z' => 30];
// concat : キーを振り直して結合
$a->concat($b);
// [0 => 1, 1 => 2, 2 => 20, 3 => 30]
// merge : キー保持、同キーは引数側で上書き
$a->merge($b);
// ['x' => 1, 'y' => 20, 'z' => 30]
// union : キー保持、同キーは元側を優先
$a->union($b);
// ['x' => 1, 'y' => 2, 'z' => 30]</code></pre>
<h2>HTML <select> を組み立てる</h2>
<h3>純粋 HTML 出力</h3>
<pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-php">// Controller
$options = Category::pluck('name', 'id')
->prepend('-- 選択してください --', '');
return view('items.create', compact('options'));</code></pre><pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-php">{{-- Blade: items/create.blade.php --}}
<select name="category_id" class="form-control">
@foreach ($options as $value => $label)
<option value="{{ $value }}" @selected(old('category_id') == $value)>
{{ $label }}
</option>
@endforeach
</select></code></pre>
<h3>Laravel Collective Form 利用時</h3>
<pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-php">{{-- composer require laravelcollective/html --}}
{!! Form::select('category_id', $options, old('category_id'), [
'class' => 'form-control',
]) !!}
{{-- $options は連想配列 / Collection どちらも可 --}}</code></pre>
<h2>optgroup(分類された select)</h2>
<pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-php">// 親子構造で送る
$groups = [
'食品' => [1 => 'パン', 2 => '米'],
'雑貨' => [3 => 'ノート', 4 => 'ペン'],
];</code></pre><pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-php"><select name="item_id">
<option value="">-- 選択してください --</option>
@foreach ($groups as $groupLabel => $items)
<optgroup label="{{ $groupLabel }}">
@foreach ($items as $id => $name)
<option value="{{ $id }}">{{ $name }}</option>
@endforeach
</optgroup>
@endforeach
</select></code></pre>
<h2>Eloquent + Collection の合わせ技</h2>
<pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-php">use App\Models\Prefecture;
// 都道府県の select オプション(先頭に空欄)
$prefs = Prefecture::orderBy('code')
->pluck('name', 'code')
->prepend('-- 選択してください --', '');
// 「その他」を末尾に追加
$prefs->put('99', 'その他');
// 結果
// ['' => '-- 選択してください --',
// '01' => '北海道', '02' => '青森県', ..., '47' => '沖縄県',
// '99' => 'その他']</code></pre>
<h2>@forelse で「データなし」のとき</h2>
<pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-php">{{-- データが空のときは「カテゴリがありません」を表示 --}}
@forelse ($categories as $cat)
<option value="{{ $cat->id }}">{{ $cat->name }}</option>
@empty
<option value="" disabled>カテゴリがありません</option>
@endforelse</code></pre>
<h2>キーを文字列で揃えるテクニック</h2>
<p>HTML form の value は<strong>常に文字列</strong>で送られるため、id を数値で持っていると <code>old()</code> の比較に <code>==</code> が必要です。型を揃えると安心:</p>
<pre style="background:#1e293b;color:#e2e8f0;padding:1em;border-radius:6px;overflow-x:auto;line-height:1.5"><code class="language-php">$options = Category::pluck('name', 'id')
->mapWithKeys(fn ($name, $id) => [(string)$id => $name])
->prepend('-- 選択してください --', '');</code></pre>
<h2>FAQ</h2>
<p><strong>Q: 配列のまま末尾に値を追加したい</strong><br />
A: PHP 配列なら <code>$arr[] = $value</code> で末尾追加、<code>array_unshift($arr, $value)</code> で先頭追加。Collection に変換せず素のままでも可。</p>
<p><strong>Q: prepend のキーが <code>0</code> や <code>''</code> で被ったらどうなる?</strong><br />
A: 既存キーが上書きされます。意図しないなら明示的にユニークキー(<code>'__placeholder__'</code> 等)を指定。</p>
<p><strong>Q: select の選択値を保持したい (old()) </strong><br />
A: <code>@selected(old('category_id') == $value)</code> または<code>{{ Form::select(..., old('category_id') ?? $model->category_id, ...) }}</code>。型に注意。</p>
<p><strong>Q: ページネーション結果に「全件」を追加したい</strong><br />
A: ページネーションオブジェクトは Collection ではないので、<code>->items()</code> で配列を取り出してから操作するか、Collection で先に組み立てた後ページング。</p>