質問: Item::join('accesses' function($join){ $join->on('items.id', '=', 'accesses.item_id') ->where('accesses.date', '>', date('Y-m-d', strtotime('-7 days'))); }) .... ```
回答: 最終的なランキング情報は、バッチ処理で作成するという前提で。 1. データベースで何とかする `流石に1つ1つのアクセスを単一のテーブルに保存するのは良くない気がして` とのことですが。別に1つ1つで構いません。 SELECT して INSERT/UPDATE するよりも楽です。 2. データベースで何とかしつつ、多少負荷も減らしたい。 memcachedやheapテーブルなどオンメモリ上で記録しておいて、 バッチで定期的に計算して、集計終わった分を削除しましょう。 3. データベースを使わない (個人的に推奨) そもそもアクセス都度書き込むのは、いろいろアプリ側で考慮すべき責任が多くなるので好ましくありません。 それに、アプリケーションがアクセス記録とらなくてもwebサーバーのアクセスログに、商品IDがクエリ文字列にありませんか? それを利用すればアプリの責任は、集計処理だけです。