Edited at

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

More than 1 year has passed since last update.


はじめに

渡されたキーワードの数によって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