2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Laravelで現在表示中の記事(News)の前後のIDを簡単に取得する。

Last updated at Posted at 2022-03-08

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にデータを渡してあげれば、前後の記事のリンクを作成することができます。
以上になります。他にも自分のやりたい条件に合わせて、参考にしていただければ良いかと思います。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?