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

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

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

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

1回答

825閲覧

【Laravel5.4】コントローラーで日付などの連続した数字データの生成をしたい

do_slice

総合スコア26

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2017/10/15 09:00

いつもお世話になってます。質問させてください。

Laravel5.4を使ってCMSを作っているのですが、
カレンダーのような連続した日付のビューの日付データの生成の仕方に困っています。

やりたいことは
・コントローラーで一定範囲の連続した年ごと、月ごとのデータを生成
・それに記事のデータをjoinし、Viewに渡したい
という感じです。

例えば2017から前後20年ずつ1997~2037というデータを作りそれを主キーにして、
記事のcreated_atでjoinして作生年月日が当年、当月に当たる記事があればjoinで紐づけて表示。
なければ日付の表示だけという処理がしたいと思っています。

記事のデータを

Articles table : Id, created_at, create_year, create_month, user_id, title, note, deleted_at

というような構造で持っています。

これと生成した日付データを紐づけて、viewに渡したいと考えており、
下記のように生成した$yearsをviewに渡しカレンダーのような画面に、
記事がある月は記事のリスト、ない月は記事作成処理へのリンクという画面が作りたいと考えています。

その場合

$this_year = Carbon::now()->year; $years = xxxx::where(‘$tihs_yearから前後20年を何かで生成) ・・・① ->leftJoin(生成した日付データとArtclesのcreate_year、create_monthで結合) ->select(必要なデータを抽出) ->get();

というようなやり方でできないかなと思っているのですが、
①のところで何か使えるツールがないかなというのが質問になります。
Carbonなどでeloquentに渡せる連続した年のデータを取得できるのでしょうか?

もしくは他のやり方で良いものがあればぜひご教示いただければ幸いです。
よろしくお願い申し上げます。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ある日付から前後20年のデータを範囲選択という条件であれば、Carbonを使う場合に一例として以下でできるかと思います。
Carbonのドキュメント等も参照してください。
Carbon Document

$current = \Carbon\Carbon::now(); $min = $current->copy()->subYears(20)->startOfDay(); $max = $current->copy()->addYears(20)->endOfDay(); $years = xxxx::whereBetween("year",[$min->year,$max->year]) ->leftJoin(結合条件) ->select(取得列) ->get();

投稿2017/10/15 12:42

aro10

総合スコア4106

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

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

do_slice

2017/10/15 15:43

aro10さま、ご回答ありがとうございます! 範囲の指定についてはいただいた回答のcarbonを使う手法で行けそうでした。 年号データーを生成するのはやはりCarbonでは難しそうでした。 $years = Carbon::whereBetween("year",[$min->year,$max->year]) ->leftJoin(結合条件) ->select(取得列) ->get(); とかできると良いのですが。。 もし何かcarbon以外で思い当たることがあれば教えていただけるとありがたいのですが、 上記の例でいう1997~2037の間の連番のコレクションデータを何かで作成して、それとデーターベースにあるデータをjoinする方法というのはないでしょうか? やはり years(カラムがid, year,などでyearカラムに使いそうな範囲の西暦年連番を入れておく) months(カラムがid,month,nameなどでmonthが1~12、nameがjan~decを入れておく) というマスターデータテーブルを作りそれとArticlesテーブルのデータをjoinするしかないでしょうか。 もし何かお気付きのことありましたらご教示いただけると幸いです。
aro10

2017/10/15 16:27 編集

状況によってはクエリビルダの条件をクロージャで複雑に設定したり、Eloquentのloadメソッドでコレクション処理中で後で関連データを取得する方法等も考えられますが、マスターデータテーブルを作るやり方でSQL的に紐付ける方法が思いつくのであれば処理速度的にもそれが無難かと思います。
do_slice

2017/10/15 16:31

aro10さま、度々ありがとうございます。 マスターを作る方法で進めたいと思います。 carbonの使い方大変参考にありました、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問