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

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

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

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

Q&A

2回答

905閲覧

getコレクションのデータをもとに日付を比較する方法

laravel12345

総合スコア2

Laravel

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

0グッド

0クリップ

投稿2021/09/27 07:11

編集2021/09/27 07:42

複数のgetのコレクションクラスをもとに日付を比較したいです。

今年のデータ $data = DB::table('books') ->where('created_at', ...) ->get(); 昨年のデータ $lastData = DB::table('books') ->where('created_at', ...1年前の日付...) ->get();

実現したいロジックとしては、
$dataの日付と$lastDataの日付をチェック(年は考慮しない)
もし日付が一致したら処理、日付が一致しなければ処理しない

自分で考えたのがforeachを二重で使うことでした。

foreach ($data as $v){ $v->created_at //これで今年のデータの日付を抽出 }

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

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

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

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

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

guest

回答2

0

mysqlの場合

text

1create table books ( 2 id integer not null auto_increment, 3 book_id integer not null, 4 book_name varchar(16) not null, 5 created_at date not null, 6 primary key (id) 7); 8 9insert into books 10(book_id,book_name,created_at) 11values 12 (100,'商品A','2019/10/1') 13,(100,'商品A','2020/10/1') 14,(100,'商品A','2021/10/1') 15,(200,'商品B','2019/10/4') 16,(200,'商品B','2020/10/4') 17,(200,'商品B','2021/10/4') 18,(300,'商品C','2019/10/5') 19,(300,'商品C','2020/10/6') 20,(300,'商品D','2021/10/7') 21; 22 23select 24 books.*, 25 ( 26 select 27 old.created_at 28 from 29 books as old 30 where 31 date_add(books.created_at, interval -1 year)=old.created_at 32 ) as old_created_at 33from 34 books 35where 36 books.created_at between '2021/1/1' and '2021/12/31' 37;

これで検索結果は

text

1+----+---------+-----------+------------+----------------+ 2| id | book_id | book_name | created_at | old_created_at | 3+----+---------+-----------+------------+----------------+ 4| 3 | 100 | 商品A | 2021-10-01 | 2020-10-01 | 5| 6 | 200 | 商品B | 2021-10-04 | 2020-10-04 | 6| 9 | 300 | 商品D | 2021-10-07 | NULL | 7+----+---------+-----------+------------+----------------+

postgresql等他の場合は「去年」というのを計算方法を変更します
なお検索した結果を元にループで再検索するというのは基本的にやらないです(遅い)
いかに一発でsql検索するかってことです

あとは自分でlaravelのqueryに落としてください

投稿2021/09/29 02:55

編集2021/09/29 02:57
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

laravel12345

2021/09/29 12:00

ご回答ありがとうございます。 SQLもわざわざ書いていただきましてありがとうございました。 ただ、今回の質問は日付が一致していたら処理して一致していなかったら処理しないなので、質問の意図とは違う内容になっています。
退会済みユーザー

退会済みユーザー

2021/09/29 12:19

結果を順番に処理すれば済みますよね? nullの場合は無処理にする
laravel12345

2021/09/29 13:19

ご回答ありがとうございます。大変申し訳ないのですが、日付は10-01をさしており、10-01が一致するか判定させたいです。 なので、if (現在の日付 == 1年前の日付) { 処理 } else { 一致しない処理 }と考えていたので、(現在の日付 == 1年前の日付)ここが具体的に知りたいって感じです。
guest

0

そもそもですが、データ構造悪い気がします・・・
さて、前提条件なのですが

text

1A)データはどのように区別できるのでしょうか? 2 商品A 2021/10/1 3 商品B 2021/9/30 4 商品A 2020/10/1 5 商品B 2020/9/30

このような感じですか?
ついでに商品Aだという事がわかるキーはありますか?
(商品Aのみをすべて検索できる、where item_name='商品A'のように

text

1B)複数年のデータは存在しますか?、それとも2年分のみですか? 2 商品A 3 商品A 2021/10/1 4 商品A 2020/10/1 5 商品A 2019/10/1

投稿2021/09/28 06:19

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

laravel12345

2021/09/28 10:05

データの構造についてですが、 booksテーブルがあって、 book_id user_id category_id book_name created_at のようになっています。 なので、データの区別はプライマリキー(book_id)を用いて判別する感じです。
退会済みユーザー

退会済みユーザー

2021/09/28 10:11

created_atの粒度はどうなっていますか? 日付のみだといいのですが、時分秒までありますか?
laravel12345

2021/09/28 12:30

時分秒は考慮せず、日付のみですね!
退会済みユーザー

退会済みユーザー

2021/09/28 23:44

日付のみはわかっています created_atはtimestampなのか、dateなのかということです timestampであれば時分秒を無視するqueryとなり面倒です 2021/10/1 10:20:30と2020/10/1 11:12:13を1年前と判断するのは面倒でしょ? データ構造がdateなら 2021/10/1と2020/10/1となるので、こちらは楽ですよね
laravel12345

2021/09/29 01:49

>>2021/10/1 10:20:30と2020/10/1 11:12:13を1年前と判断するのは面倒でしょ? 確かに面倒ですね...ただ、今回の場合は、dateになります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問