where文が思い通りに動かない


目次

1.where文のちょっとした違い
2.大前提条件

Laravelの勉強で少し躓いた部分があったのでアウトプットします。

1. where文のちょっとした違い

ブログサイトの、ブログ検索機能を作るにあたり、
「公開中の記事の中から、タイトルか本文が検索ワードと一致した記事だけを表示する」
という where文 を書きました。

$posts = Post::where('title', 'like', "% {{$request->search_word}} %")
->orWhere('content', 'like', "% {{$request->search_word}} %")
->where('is_published', 1)
->get();

しかしこれだと思い通りの動きをしてくれず、非公開中の記事まで表示されてしまいました。
->where('is_published', 1)この部分が反応していないのです。

2. 大前提条件

色々調べた結果、上記の書き方は
「タイトルが検索ワードと一致する記事、
 もしくは本文が検索ワードと一致する記事か公開中の記事。」

という風になっていました。
簡単に言うと、A or ( B && C ) ということです。

ただ、実装したいのは、A && ( B or C ) なので、

$posts = Post::where('is_published' ,1)
->where(function($query){
 $query->where('title', 'like', "% {{$request->search_word}} %")
 ->orWhere('content', 'like', "% {{$request->search_word}} %")
})->get();

こうするのが正解です。

where('is_published' ,1) を大前提条件として、その中で条件に合った記事を取得するということです。

ただ正直、
「最初の書き方のまま ->where('is_published', 1) を一番最初に持ってくればいいんじゃないの!?」
と思いましたが、わかりやすくて正しい書き方はこちらのようです。
ただ動く書き方ではなく、正しい書き方ができるようにならなきゃな〜〜。
今日のアウトプットは以上です!