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);
    }

Laravel超入門