1つ前のレコードと1つ後のレコードを取得する(laravel Eloquent)

1 min read読了の目安(約1200字

今回は対象のレコードの前後を取得したいことがありましたので、そのときの解決策を残しておきたいと思います。

下記のように、1つ前のレコード(previousUser)と1つ後のレコード(nextUser)を取得できることを最終目標とします。

$user = User::find(1);
$previousUser = $user->previous();
$nextUser = $user->next();

※ちなみに今回はidを軸として前後としていますが、例えば日付など比較できるものであれば他のカラムを軸にすることもできます。

前後のレコードを取得する

モデル内にpreviousとnextのメソッドを追記します。

今回はUser.phpとします。


class User extends Model 
{
.
.
.

    public function previous()
    {
        return $this->where('id', '<', $this->id)->orderBy('id', 'desc')->first();
    }
    
    public function next()
    {
        return $this->where('id', '>', $this->id)->orderBy('id', 'asc')->first();
    }
}

これで完成です。

1つ前のレコードを取得したい場合は、「idを降順にソートして、今のidよりも小さいidをもつレコードの最初のものを取得する」というロジックになります。

例えばレコードが5つあり、それぞれIDが「1, 2, 3, 4, 5」だとします。IDが「3」の1つ前を取得したい場合は、

  1. id降順でソートする → 「5, 4, 3, 2, 1」になる
  2. IDが「3」よりも小さいものに絞る → 「2, 1」になる
  3. 最初のものを取得する → 「2」が取得できる

というような流れになっています。

1つ後のレコードを取得する場合もほとんど同じようなステップで、

  1. id昇順でソートする → 「1, 2, 3, 4, 5」になる
  2. IDが「3」よりも大きいものに絞る → 「4, 5」になる
  3. 最初のものを取得する → 「4」が取得できる

というふうになっています。

↓このような感じで前後のレコードを取得できます。

$user = User::find(3);
$previousUser = $user->previous();
$nextUser = $user->next();

おわりに

今回は前後のレコードを取得する方法について解説しました。
応用すれば、idではなく日付を軸に前後のレコードを取得することもできるので、もし前後のレコードを取得しなければならない機会がありましたら、ぜひ使ってみてくださいね!