Reputation: 363
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
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