通过 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 表更新存储过程?