DutchPrince
DutchPrince

Reputation: 363

Laravel infinite previous and next on model

How to make infinite previous and next "model" with laravel

I have made a query to access previous and next tasks, and i wanted to share it.

I would love some feedback to get a better query though

$taskSlug = $request->only('task'); // your request

$task = Task::where('slug', $taskSlug)->first(); // the requested task

$previous = Task::where('id', '<', $task->id)->exists() ? Task::where('id', '<', $task->id)->orderBy('id', 'desc')->first() : Task::where('id', '!=', $task->id)->orderBy('id', 'desc')->first(); // previous task

$next = Task::where('id', '>', $task->id)->exists() ? Task::where('id', '>', $task->id)->orderBy('id')->first() : Task::where('id', '<', $task->id)->orderBy('id', 'asc')->first(); // next task

return response()->json([$task, $previous, $next], 200); // ajax response

If someone has a better and less extensive query for this please let me know

Upvotes: 0

Views: 46

Answers (1)

Marc
Marc

Reputation: 1430

I believe you want to do something like this :

$task = Task::where('slug', $taskSlug)->first();
$previous_id = Task::where('id', '<', $task->id)->max('id');
$next_id = Task::where('id', '>', $task->id)->min('id');

You get the maximum id in range [first record to task id] in order to get the previous task.
You get the minimum id in range [task id to last record] in order to get the next task.

Then you can do :

$previous = Task::find($previous_id);
$next = Task::find($next_id);

Upvotes: 2

Related Questions