質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
Laravel

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

Q&A

解決済

1回答

571閲覧

laravelでのwhere検索に関して

tktail

総合スコア72

Laravel

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

0グッド

0クリップ

投稿2021/12/22 05:26

こんにちは。

DBから去年のデータを抽出したいと思い、以下のSQLを記述しました。

$last_year = '2020'; $hoge_log_data = HogeLog::with(['piyo', 'fuga']) ->orderBy('id', 'DESC') ->whereIn('id', $user_id) ->where('toc', 'like', '%' . $last_year . '%') ->get();

テーブルにはtocという名前のカラムが存在しており、中には「2014-08-03 01:33:11.284905」というデータが入っています。
WEBで調べたところ、whereで先述のように引数を渡せば検索できると出てきたのですが、結果は2021年のデータが取得されています。

どのようにすれば去年のデータが取得できますでしょうか?
ご指摘、よろしくお願い致します。

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

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

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

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

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

skys215

2021/12/22 06:22

$last_yearの値はなんですか? $hoge_log_dataの前に\DB::enableQueryLog(); ->get();の後にdd(\DB::getQueryLog()); でSQLが見えます。 作り上げたSQLが正しいか確認をお願いします。
tktail

2021/12/22 06:35

skys215さん いつもありがとうございます。 $last_yearの値は2020です。 作り上げたSQLを実行したところ以下のように出てきました。 なぜこんなクエリになっているのか理解できません。。。 array:3 [▼ 0 => array:3 [▼ "query" => "select * from "hoge_log" where "toc"::text LIKE ? and "id" in (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) order by "id" desc limit 25 ◀" "bindings" => array:260 [▶] "time" => 1532.12 ] 1 => array:3 [▼ "query" => "select * from "piyo" where "piyo"."id" in (11)" "bindings" => [] "time" => 493.65 ] 2 => array:3 [▼ "query" => "select * from "fuga" where "fuga"."id" in (10, 10, 22, 84, 06, 34, 50, 31)" "bindings" => [] "time" => 496.91 ] ]
tktail

2021/12/22 06:57

2020-09-23 17:04:11.62011 この場合は頭の2020に引っかかって 2021-09-23 17:04:11.20201 この場合は後ろの文字列に引っかかっていましたので ->where('toc', 'like', '%' . $last_year) このように変更しました。 例えば $this_month='2020-09' として年月とした場合は、引っかからないのですが、ハイフンなどは入れることが出来ないのでしょうか? それとも正規表現などを使用しないといけないのでしょうか?
tktail

2021/12/22 07:00

MYas30さんの書き方(後ろに%をつける)で解決することができました。 いつもお力添えを頂き、ありがとうございます。 またよろしくお願い致しますm(_ _)m
guest

回答1

0

ベストアンサー

「toc」はタイムスタンプですかね。

タイムスタンプでしたら大小の比較(>とか<とか)でいけそうだと思うのですがいかがでしょうか。

投稿2021/12/22 06:23

MYas30

総合スコア29

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

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

tktail

2021/12/22 06:36

ご回答ありがとうございます。 カラムはstring型になっており、比較には別の手間を入れる必要があることから、文字列検索したいと思います。。
MYas30

2021/12/22 06:53

>結果は2021年のデータが取得されています。 とありますが、この「2021年のデータ」の途中に「2020」($last_year = '2020'のため)が含まれていたりするのではないでしょうか。 例:2021-08-03 01:33:11.202005 先頭だけの一致なら ->where('toc', 'like', $last_year . '%') でどうでしょうか。 ※tocに、「〇〇〇〇 2014-08-03 01:33:11.284905」みたいなデータもあるのであれば話は別ですが
tktail

2021/12/22 07:01

skys215さんのところにも書きましたが、確かに取得できていました。。 そして、先頭だけの場合は”後ろに”%をつければよろしいのですね。 おかげさまで無事解決することが出来ました。 この度はお力添え頂きありがとうございました。 また機会がありましたらよろしくお願い致しますm(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問