NewsやBlogの詳細ページの前後のデータをDBレコードから取りたい
ニュースページや、Blog機能を作成したときに、
サイト導線として、前後の記事のリンクを作成したときに、
どうしたら良い?って思ったとき、簡単に見つける方法があります。
DBのテーブル見本
URLでは、ID3の記事を表示しているとします。
id(主) | status | title | content | public_at | updated_at | created_at |
---|---|---|---|---|---|---|
1 | 1 | タイトル1 | 記事の内容 | 2022-01-01 | 2021-12-31 10:00:00 | 2021-12-31 10:00:00 |
2 | 1 | タイトル2 | 記事の内容 | 2022-01-10 | 2022-01-05 10:00:00 | 2022-01-05 10:00:00 |
3 | 1 | タイトル3 | 記事の内容 | 2022-01-20 | 2022-01-10 10:00:00 | 2022-01-10 10:00:00 |
4 | 1 | タイトル4 | 記事の内容 | 2022-01-31 | 2022-01-20 10:00:00 | 2022-01-20 10:00:00 |
※status 1は公開、0は下書きとします。
※今日の日付は、2022年2月15日とします。
Controller
コントローラにて、簡単に前後の記事IDを探してこれます。
現在表示中の記事の公開日より、新しいか古いかをWhere条件に含め、並び順のorderByで探し当てるのがPOINT!です!!
Controller
/**
* NEWS
* @return Factory|View
*/
protected function news_details($id)
{
//日付が公開日が、今日より前で、ステータスが公開ステータスの記事を取ってくる。
//Newsは、Eloquent Modelです。
$news_contents = News::where([['public_at', '<', Carbon::now()],['status',1],['id',$id]])->first();
//条件に満たない記事のidの場合、404ページを表示
if(blank($news_contents)){
abort(404);
}
//現在表示中の記事の1つ前の記事(リンク先を作りたいからselectでidのみ取得)
$news_contents_prev = News::select('id')->where([['public_at', '<', Carbon::now()],['status',1],['public_at', '<', $news_contents->public_at]])->orderBy('public_at', 'desc')->first();
//現在表示中の記事の1つ後ろの記事(リンク先を作りたいからselectでidのみ取得)
$news_contents_next = News::select('id')->where([['public_at', '<', Carbon::now()],['status',1],['public_at', '>', $news_contents->public_at]])->orderBy('public_at', 'asc')->first();
return view('front.page.news-details', [
//現在のコンンテンツ
'news_contents' => $news_contents,
//レコードが存在しない場合はNULLを渡す
'prevID' => (!blank($news_contents_prev))?$news_contents_prev->id:null,
'nextID' => (!blank($news_contents_next))?$news_contents_next->id:null,
]);
}
おわり
これにて、Viewにデータを渡してあげれば、前後の記事のリンクを作成することができます。
以上になります。他にも自分のやりたい条件に合わせて、参考にしていただければ良いかと思います。