通过 URL 将几列传递给 orderBy 方法

Posted

技术标签:

【中文标题】通过 URL 将几列传递给 orderBy 方法【英文标题】:Pass several columns to an orderBy method via URL 【发布时间】:2018-10-09 11:22:08 【问题描述】:

我在 Lumen 5.6(Laravel 微框架)中有这段代码,我想为多个列使用 orderBy 方法,例如,http://apisurl/books?orderBy=devices,name,restrictions,category 也发送 asc 或 desc 顺序。

Lumen 的文档说我们可以像这样使用 orderBy

$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);

【问题讨论】:

你能显示你试过的foreach吗? 作为旁注,$status = !is_null($books) ? 200 : 204; 行将始终返回 false,因为 $books 将返回分页器的实例,而不是 null。你想要$status = $books->isNotEmpty() ? 200 : 204; 【参考方案1】:

你可以这样做:

// 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);

【讨论】:

伟大的@devk 如何使用这个foreach 管理asc 和/或desc 选项?我从这样的事情开始,但你的解决方案是更好的。 @FranklinG.Mendoza 您可以将其作为第二个参数传递给->orderBy($param, $order)

以上是关于通过 URL 将几列传递给 orderBy 方法的主要内容,如果未能解决你的问题,请参考以下文章

将值、NULL 或不更新此列传递给 Oracle 表更新存储过程?

将列传递给 UDF

如何将多个数据框列传递给函数[重复]

python dataframe将两列传递给函数python

如何将数据框列传递给scala函数

如何在执行 SELECT... 语句时将表列传递给 plpgsql 函数