Как сделать, чтобы Ресурс Laravel Eloquent включал в ссылки параметры фильтра? - PullRequest
0 голосов
/ 07 февраля 2019

Мы немного экспериментируем со сборщиком запросов Spatie, и я хотел бы вернуть коллекцию ресурсов.

К сожалению, когда вы добавляете фильтры в запрос, они не отправляются обратно как частьпервая, последняя, ​​предыдущая и следующая ссылки ответа.

это наш код (просто пример с очень простым режимом ExchangeRate:

class ExchangeRateController extends Controller
{
    public function index(Request $request) {
       return \App\Resources\ExchangeRate::collection(
         QueryBuilder::for(ExchangeRate::class)
            ->allowedFilters(
                Filter::exact('currency'), 
                Filter::scope('valid-on')
            )
            ->paginate());
    }
}

Когда мы вызываем GET /api/exchangerates мы получаем 3 страницы по 15 записей каждая. Когда мы вызываем GET /api/exchangerates?filter[currency]=USD, мы получаем 1 страницу только с одной записью. Это нормально, но ссылки в ответе json не получают правильных ссылок.

Без фильтра мы получаем следующие ссылки:

"links": {
  "first": "https://example.com/api/exchangerates?page=1",
  "last": "https://example.com/api/exchangerates?page=3",
  "prev": null,
  "next": "https://example.com/api/exchangerates?page=2"
}

С помощью фильтра мы получаем следующие ссылки в ответе:

"links": {
  "first": "https://example.com/api/exchangerates?page=1",
  "last": "https://example.com/api/exchangerates?page=1",
  "prev": null,
  "next": null
}

Таким образом, он выполняет свою нумерацию страниц правильно, но фильтры не включены в ссылки, что я считаю неправильным (клиент должен иметь возможность доверять этим ссылкам для получения следующая страница своего текущего выбранного набора данных...)

Есть лив любом случае, что мы можем сделать это?

1 Ответ

0 голосов
/ 07 февраля 2019

Я не думаю, что это было бы ответственностью пакета.Пагинация Laravel не сохраняет строки запросов в ссылках.Кажется, это поведение с 4.2.См. this.

Вы можете сделать это с помощью следующего:

class ExchangeRateController extends Controller
{
    public function index(Request $request) {
        return \App\Resources\ExchangeRate::collection(
            QueryBuilder::for(ExchangeRate::class)
                ->allowedFilters(
                    Filter::exact('currency'), 
                    Filter::scope('valid-on')
                )
                ->paginate()
                ->appends($request->input('currency', 'valid-on'))
        );
    }
}
...