15. 検索とソート
SQL検索処理
フォームからSQL検索処理をするには、クエリーパラメーターから検索キーワードの取得とSQLで条件指定が必要です。
query()
「Request」オブジェクトの query() でクエリパラメータを取得します。
public function index(Request $request)
{
$keyword = $request->query('キー');
...
}
条件指定
SQLで条件指定したQueryBuilderのプログラムです。
// SELECT * FROM users WHERE age > 18;
$users = DB::table('users')
->where('age', '>', 18)
->get();
項目 | 記号・メソッド・構文など | 備考 |
---|---|---|
比較演算子 | =, >, <, >=, <=, != | |
AND | where() | メソッドチェーン |
OR | orWhere() | |
IN | whereIn() | |
NULL | whereNull() | |
NOT NULL | whereNotNull() | |
複雑な条件 | where(function () {...}) |
where()
where() はSQLクエリWHEREを指定するメソッドで、特定の条件を持つレコードを取得するクエリを作成できます。
whrere(カラム, 比較演算子, 値)
LIKE検索
完全一致検索
完全一致検索だと、仮に「コーヒー」をキーワードに「アイスコーヒー」は検索できません。
完全一致
// SELECT * FROM items WHERE name = 'コーヒー';
Item::where('item', 'コーヒー')->get();
部分検索
部分検索は LIKE句で、値の前後を *%*で囲みます。
部分検索
// SELECT * FROM items WHERE name LIKE '%コーヒー%';
Item::where('item', 'LIKE', '%コーヒー%')->get()
商品検索
Requestオブジェクト設定
「ItemController」の index() の引数に、「Request」オブジェクトを指定します。
ItemController.php
public function index(Request $request)
{
...
}
キーワード検索処理
クエリパラメータnameを取得できれば、部分検索します。キーワードがなければ、すべて取得します。
ItemController.php
public function index(Request $request)
{
if ($name = $request->query('name')) {
$items = Item::where('name', $name)->get();
} else {
$items = Item::get();
}
$data = ['items' => $items];
return view('item.index', $data);
}
URLにnameパラメーターをつけて送信すると、指定した商品名で検索できます。
結果
並び替え
orderBy()
orderBy() は、特定のカラムを基準にレコードを並び替えるメソッドです。第2引数にレコードの並び順を指定できます。
orderBy()
// ORDER BY カラム名 ASC;
orderBy('カラム名', 'asc');
// ORDER BY カラム名 DESC;
orderBy('カラム名', 'desc');
価格で並び替え
商品価格の安い順で、すべての商品を取得するSQLはつぎのとおりです。
// SELECT * FROM items ORDER BY price ASC;
Item::orderBy('price', 'asc')->get();
ItemController.php
public function index(Request $request)
{
$order = ($request->order) ? $request->order : 'asc';
if ($name = $request->query('name')) {
$items = Item::where('name', $name)->orderBy('price', $order)->get();
} else {
$items = Item::orderBy('price', $order)->get();
}
$data = ['items' => $items];
return view('item.index', $data);
}