おーしまブログ

プログラミングやってます

【PHP】checkboxでいくつか選べる検索(クエリビルタ)

こんにちは、おーしまです。


今回はcheckboxで選択された中で、どのような選ばれ方をしても検索できる方法について書きます。


例えば、
車を管理しているcarsテーブルがあったとします。

そのカラムの1つに、カーナビが付いているかを管理するnavi_statusカラムがあったとします。
内容は、
1:Bluetooth付きカーナビ
2:Bluetoothなしカーナビ
3:カーナビなし
です。

この時、checkboxを用いて、カーナビの有無で検索機能を作成する際は、

<lavel>
    <input type="checkbox" name="navi_status[]" value="1">
    <span>Bluetooth付きカーナビ</span>
</lavel>
<lavel>
    <input type="checkbox" name="navi_status[]" value="2">
    <span>Bluetoothなしカーナビ</span>
</lavel>
<lavel>
    <input type="checkbox" name="navi_status[]" value="3">
    <span>カーナビなし</span>
</lavel>

のように書きます。

こうすることで、

・全部選択した時:[1, 2, 3]
・2つ選択した時:[1, 2] [1, 3] [2, 3]
・1つ選択した時:[1] [2] [3]
・選択していない時:パラメータなし

のようになります。


あとは、

//$condition['navi_status']に先程の配列が入っている

$select = Car::select();

if(! empty($condition['navi_status'])) {
    $select->whereIn('navi_status', $condition['navi_status']);
}

//その他の検索条件↓

と記述します。

whereIn('カラム', [配列])

で、カラムの値が配列内の値と同じものだけ、取得できます。

(もし、どの選択肢も選択されていない場合は、$condition['navi_status']が無く、
if(! empty($condition['navi_status']))でfalseを返すので、[1, 2, 3]が入っている時と同じになります。
対策はできますが、どの選択肢も選択されていない場合は何も返さないというのは検索にならないし、、、
そこは皆さんにお任せします)


今回はここまでです。
それでは、また。

ここはどこ おれはだれ それに近いものがあんだよ 始めようとした奴らも迷い始めてる 怖がらせないでよ そりゃ甘くはないけど まだまだ 夢見ていい世界なんでしょ {UVERwould「ハイ!問題作」}