Передать несколько столбцов методу orderBy через URL - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть этот код в Lumen 5.6 (микрофрейм Laravel), и я хочу иметь метод orderBy для нескольких столбцов, например, http://apisurl/books?orderBy=devices,name,restrictions,category также отправлять заказы asc или desc.

В документации Люмена говорится, что мы можем использовать порядок, как этот

$books = PartnersBooks::all()->orderBy('device', 'asc')->orderBy('restrictions', 'asc')->get();

Итак, я создал функцию с foreach для заполнения массива различными значениями запросов orderBy и попытался выполнить красноречивые запросы, но безуспешно.

Кто-нибудь может мне помочь?

use Illuminate\Http\Request;

public function index(Request $request)
{
    $limit = $request->input('limit');

    $books = PartnersBooks::where('is_direct', '=', 1)
      ->with('direct')
      ->whereHas('direct', function ($query) {
          $query->enable()
            ->select(['id', 'book_id', 'name', 'devices', 'flow', 'restrictions', 'countries', 'targeting']);
      })
      ->orderBy('id', 'asc')
      ->paginate($limit, ['id', 'category', 'description']);

     $status = !is_null($books) ? 200 : 204;
     return response()->json($books, $status);
}

1 Ответ

0 голосов
/ 29 апреля 2018

Вы можете сделать это:

// Get order by input
$orderByInput = $request->input('orderBy');
// If it's not empty explode by ',' to get them in an array, 
// otherwise make an empty array
$orderByParams = !empty($orderByInput) 
    ? explode(',', $orderByInput)
    : [];

$query = PartnersBooks::where('is_direct', '=', 1)
    ->with('direct')
    ->whereHas('direct', function ($query) {
      $query->enable()
        ->select(['id', 'book_id', 'name', 'devices', 'flow', 'restrictions', 'countries', 'targeting']);
    });

// Foreach over the parameters and dynamically add an orderBy
// to the query for each parameter
foreach ($orderByParams as $param) {
    $query = $query->orderBy($param);
}

// End the query and get the results
$result = $query->paginate($limit);
...