🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Null

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

1985閲覧

Laravel; whereによる検索フォームで、値がnullならば、whereではなく、orWhereを返す様にしたい。

Reikirin

総合スコア23

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Null

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2021/03/06 09:13

編集2021/03/06 09:27

LaravelのversionとしてはLaravel Framework 8.27.0を使っています。

Userとしてログインし、情報を入力して、それをBoardに保存して、検索によって、そのBoardの情報を取り出すことができる様なアプリを作ろうとしております。
UserとBoardの情報が結びついていることがわかる様に、withによるEagerローディングを使って、検索結果のBoardの情報の隣にUserのnameを表示できる様にはできました。

ここで、検索項 info_1 ~ info_5 のうち、送信された一つの入力値でもBoardに保存されているものの持つ項に一致するものがあれば、取り出せる様にしたいです。
即ち、検索項 info_1 ~ info_5 のうち、空きの状態で送信しても他の項が入力されていれば、入力値に適うものを取り出したいです(全て空きの場合は全てのBoard情報を取り出す)。
知識がない状態で実現しようとすると、以下の様な無骨な場合訳になりますが、スマートな記述の仕方があればご教授いただきたいです。

HelloController

1 if($request->info_1 = null) { 2 $items = Board::with('user')->orWhere('info_1', 'like', '%' . $request->info_1 . '%') 3 ->where('info_2', 'like', '%' . $request->info_2 . '%') 4 ->where('info_3', 'like', '%' . $request->info_3 . '%') 5 ->where('info_4', 'like', '%' . $request->info_4 . '%') 6 ->where('info_5', 'like', '%' . $request->info_5 . '%') 7 ->get(); 8 } 9 if($request->info_2 = null) { 10 $items = Board::with('user')->where('info_1', 'like', '%' . $request->info_1 . '%') 11 ->orWhere('info_2', 'like', '%' . $request->info_2 . '%') 12 ->where('info_3', 'like', '%' . $request->info_3 . '%') 13 ->where('info_4', 'like', '%' . $request->info_4 . '%') 14 ->where('info_5', 'like', '%' . $request->info_5 . '%') 15 ->get(); 16 } 17 if($request->info_3 = null) { 18 $items = Board::with('user')->where('info_1', 'like', '%' . $request->info_1 . '%') 19 ->where('info_2', 'like', '%' . $request->info_2 . '%') 20 ->orWhere('info_3', 'like', '%' . $request->info_3 . '%') 21 ->where('info_4', 'like', '%' . $request->info_4 . '%') 22 ->where('info_5', 'like', '%' . $request->info_5 . '%') 23 ->get(); 24 } 25 if($request->info_4 = null) { 26 $items = Board::with('user')->where('info_1', 'like', '%' . $request->info_1 . '%') 27 ->where('info_2', 'like', '%' . $request->info_2 . '%') 28 ->where('info_3', 'like', '%' . $request->info_3 . '%') 29 ->orWhere('info_4', 'like', '%' . $request->info_4 . '%') 30 ->where('info_5', 'like', '%' . $request->info_5 . '%') 31 ->get(); 32 } 33 if($request->info_5 = null) { 34 $items = Board::with('user')->where('info_1', 'like', '%' . $request->info_1 . '%') 35 ->where('info_2', 'like', '%' . $request->info_2 . '%') 36 ->where('info_3', 'like', '%' . $request->info_3 . '%') 37 ->where('info_4', 'like', '%' . $request->info_4 . '%') 38 ->orWhere('info_5', 'like', '%' . $request->info_5 . '%') 39 ->get(); 40 } 41 if($request->info_1 = null and $request->info_2 = null) { 42 $items = Board::with('user')->orWhere('info_1', 'like', '%' . $request->info_1 . '%') 43 ->orWhere('info_2', 'like', '%' . $request->info_2 . '%') 44 ->where('info_3', 'like', '%' . $request->info_3 . '%') 45 ->where('info_4', 'like', '%' . $request->info_4 . '%') 46 ->where('info_5', 'like', '%' . $request->info_5 . '%') 47 ->get(); 48 } 49 if($request->info_1 = null and $request->info_3 = null) { 50 $items = Board::with('user')->orWhere('info_1', 'like', '%' . $request->info_1 . '%') 51 ->where('info_2', 'like', '%' . $request->info_2 . '%') 52 ->orWhere('info_3', 'like', '%' . $request->info_3 . '%') 53 ->where('info_4', 'like', '%' . $request->info_4 . '%') 54 ->where('info_5', 'like', '%' . $request->info_5 . '%') 55 ->get(); 56 } 57 if($request->info_1 = null and $request->info_4 = null) { 58 $items = Board::with('user')->orWhere('info_1', 'like', '%' . $request->info_1 . '%') 59 ->where('info_2', 'like', '%' . $request->info_2 . '%') 60 ->where('info_3', 'like', '%' . $request->info_3 . '%') 61 ->orWhere('info_4', 'like', '%' . $request->info_4 . '%') 62 ->where('info_5', 'like', '%' . $request->info_5 . '%') 63 ->get(); 64 } 65 if($request->info_1 = null and $request->info_5 = null) { 66 $items = Board::with('user')->orWhere('info_1', 'like', '%' . $request->info_1 . '%') 67 ->where('info_2', 'like', '%' . $request->info_2 . '%') 68 ->where('info_3', 'like', '%' . $request->info_3 . '%') 69 ->where('info_4', 'like', '%' . $request->info_4 . '%') 70 ->orWhere('info_5', 'like', '%' . $request->info_5 . '%') 71 ->get(); 72 } 73 if($request->info_2 = null and $request->info_3 = null) { 74 $items = Board::with('user')->where('info_1', 'like', '%' . $request->info_1 . '%') 75 ->orWhere('info_2', 'like', '%' . $request->info_2 . '%') 76 ->orWhere('info_3', 'like', '%' . $request->info_3 . '%') 77 ->where('info_4', 'like', '%' . $request->info_4 . '%') 78 ->where('info_5', 'like', '%' . $request->info_5 . '%') 79 ->get(); 80 } 81 if($request->info_2 = null and $request->info_4 = null) { 82 $items = Board::with('user')->where('info_1', 'like', '%' . $request->info_1 . '%') 83 ->orWhere('info_2', 'like', '%' . $request->info_2 . '%') 84 ->where('info_3', 'like', '%' . $request->info_3 . '%') 85 ->orWhere('info_4', 'like', '%' . $request->info_4 . '%') 86 ->where('info_5', 'like', '%' . $request->info_5 . '%') 87 ->get(); 88 } 89 90 91...... 92 93 94 95 if($request->info_1 = null and $request->info_2 = null and $request->info_3 = null and $request->info_4 = null and $request->info_5 = null) { 96 $items = Board::with('user')->orWhere('sports', 'like', '%' . $request->sports . '%') 97 ->orWhere('area', 'like', '%' . $request->area . '%') 98 ->orWhere('univ', 'like', '%' . $request->univ . '%') 99 ->orWhere('circle', 'like', '%' . $request->circle . '%') 100 ->orWhere('date', 'like', '%' . $request->date . '%') 101 ->get(); 102 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2021/03/06 09:16

>Laravel Framework 8.27.0 当該書籍は第2版としても2019年なので8には対応してないんじゃないでしょうか。 バージョン差を自身で吸収、調整できるなら良いのですが、 基本は書籍と同じバージョンのものを使うか、使いたいバージョンに対応した書籍を求めるか、 望ましいのは公式(もしくはそれに近しい)ドキュメントを元に進めることですが。
Reikirin

2021/03/06 09:26

すみません、書き方がまずかったですが、Laravelのバージョンの差による不具合は、ここでは解決しているものとして、単純に、コードとして、ifによる場合分けをすっきり書く方法が知りたいです。
m.ts10806

2021/03/06 09:29

なるほど、ただ if($hoge = null) これは単に代入してるだけなので、そこは仮のコードとしても直した方が良いです。 もちろん実際のコードならもっとですが。
Reikirin

2021/03/06 11:50

すみません==にするべきですよね。。。ご回答いただいた内容を読んでいるのですが理解できなくて、今解読中です
guest

回答2

0

ベストアンサー

Board::with('user')->where(function ($query) use($request) { if ($request->has('info_1')) { $query->orWhere('info_1', 'like', $request->info_1.'%'); //これを繰り返す or foreach rangeとかで動的に組む } });

やりたい事間違ってるかもしれませんが、こんな感じでwhereのコールバックを使って動的に切り替える事ができます。
また、コールバック使わなくても

$board_query = Board::query(); if ($request->has('info_1')) { $board_query->where('info1', 'like', '以下略'); }

$boards = $board_query->get();

みたいな感じで分割してクエリを書く事も可能です。

投稿2021/03/07 06:34

mikkame

総合スコア5036

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2021/03/07 07:42 編集

2つ目の方が見た目は分かりやすいですね(質問見たときに最初にイメージした形でした)。
mikkame

2021/03/07 08:11

見た目は良いですがorWhereの特性上、コールバックに押し込んだ方が良いです
m.ts10806

2021/03/07 08:17

参考になります。
Reikirin

2021/03/09 09:51

遅くなり、すみません。理解に時間がかかって、勉強してからの判断になりました。回答していただいた、m.ts10806、mikkameさん、ありがとうございました。どちらの回答も参考にさせていただきます。
guest

0

過去質問に参考になるかもしれない回答はありました。
teratail:Laravelのeloquentにて検索値を挿入したい時のEloquentの使い方

上記質問は5.8がリンクされてますが、8でもあります。
Laravel 8.x データベース:クエリビルダ:条件節

投稿2021/03/06 09:38

m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問