首页 > 解决方案 > 如何随机化 ResourceCollection 的结果但仍然对 api 结果进行分页

问题描述

我在 Laravel 中设置了一个 API,它返回存储在我的数据库中的专辑的分页结果。它目前返回 15 个结果,其余的分页,但是我想在分页之前随机化结果。这是我的 api.php 中的代码

<?php

use Illuminate\Http\Request;
use App\Album;

Route::apiResource('/album', 'AlbumController'); 

这是 AlbumController.php 的代码

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Album;
use App\Http\Resources\AlbumResource;
use App\Http\Resources\AlbumResourceCollection;

class AlbumController extends Controller
{
    /**
     * Return AlbumResource which wraps all data in an object named data.
     *
     * @param Album $album
     * @return AlbumResource
     */
    public function show(Album $album): AlbumResource {
        return new AlbumResource($album);
    }

    public function index(): AlbumResourceCollection {
        return new AlbumResourceCollection(Album::paginate());
    }
}

我尝试更改 index() 函数,并且能够随机化 15 个结果,但是,我最终失去了分页。我确实通过将功能更改为此来实现了这一点:

    public function index(): AlbumResourceCollection {
        return new AlbumResourceCollection(Album::all()->random(15));
    }

我想要的是这样的东西:

  1. 获取所有结果
  2. 随机化结果
  3. 分页

我也尝试过,但出现错误:

    public function index(): AlbumResourceCollection {
        return new AlbumResourceCollection(Album::all()->random()->paginate());
    }

关于我能做些什么来实现这一点的任何想法?

标签: phplaravel

解决方案


我的问题的解决方案与评论中提到的 lagbox 一样。我将索引函数更新为以下内容:

    public function index(): AlbumResourceCollection {
        return new AlbumResourceCollection(Album::inRandomOrder(rand(0, 5000))->paginate());
    }

推荐阅读