PHP
laravel5.4

laravel5.4クエリビルダのwhereとorWhereをfor文で使う

はじめに

渡されたキーワードの数によってwhere文を変えたいということがありました。
具体的には、2つ以上キーワードがあるときは、2つ目からはorWhereにするという感じです。
クエリビルダで書くと結構長くなりました。

コード

catsController.php
    public static function getName($keyWords)
    {
        $result = array();
        return $result = DB::table('Cats')
        ->select('Name')
        ->where(function ($query) use ($keyWords){
            if(count($keyWords) > 1)
            {
                $query->where('Description', 'like', "%$keyWords[0]%");
                for($i=1;$i<count($keyWords);$i++)
                {
                    $query->orWhere('Description', 'like', "%$keyWords[$i]%");
                }
            }
            else if(count($keyWords) == 1)
            {
                $query->where('Description', 'like', "%$keyWords%");
            }
        })
        ->orderBy('Name', 'asc')
        ->get();
    }
Catsテーブル
ID Name Description
1 blossom blossomは茶トラです。
2 bubbles bubblesは白と灰色です。
3 buttercup buttercupは茶トラです。

渡されたキーワードが1つだった場合と、1つを超える場合で出しわけをしています。
1つを超える場合は、そのキーワードの2つ目からはorWhereをfor文でまわしています。
発行されるSQLと実行結果は、以下のような感じになります。

キーワードが2つ以上だった場合

select Name from Cats where (Description like "%bubbles%" or Description like "%blossom%") order by Name asc
Name
blossom
bubbles

キーワードが1つだった場合

select Name from Cats where (Description like "%bubbles%") order by Name asc
Name
bubbles