【发布时间】:2019-01-04 11:03:19
【问题描述】:
您好,我正在开发一个用于检索分页用户列表的 REST API 端点。在前端,可以选择搜索所有列出的列、按所有列排序以及按名称、状态和创建日期过滤。
到目前为止,我已经在用户模型中创建了一个存储库和本地范围,用于搜索、排序和过滤。到目前为止,这是我的代码。我对过滤器选项感到困惑。由于用户具有所有三个选项的呼叫过滤器。如何以最优化的方式在 api 中传递这些值?
控制器:
public function index(Request $request)
{
$this->userRepository->getAllUsers($request);
}
存储库功能:
public function getAllUsers($request)
{
// Search Parameter
isset($request->q)? $q = $request->q: $q = null;
// Sort Parameter
if ( isset($request->sortby) && (isset($request->direction)) ) {
$sort[$request->sortby] = $request-> direction;
}
return User::where('type','=','student')
->ofSearch($q)
->ofSort($sort)
->paginate($per_page)
}
型号:
public function scopeOfSearch($query, $q)
{
if ( $q ) {
$query->orWhere('name', 'LIKE', '%' . $q . '%')
->orWhere('school', 'LIKE', '%' . $q . '%')
->orWhere('email', 'LIKE', '%' . $q . '%')
->orWhere('phone', 'LIKE', '%' . $q . '%')
->orWhere('class', 'LIKE', '%' . $q . '%');
}
return $query;
}
public function scopeOfSort($query, $sort = [])
{
if ( ! empty($sort) ) {
foreach ( $sort as $column => $direction ) {
$query->orderBy($column, $direction);
}
}
else {
$query->orderBy('users.name');
}
return $query;
}
【问题讨论】:
-
你能举一些典型请求的例子(及其参数)吗?
-
要使用 Laravel 5.6 实现一个干净的 REST API,我建议使用 Resources。这为您提供了 ootb 分页选项并允许您添加元数据。这是推荐的方式!
-
@Phil795:嗨,Phil,我正在使用资源和资源集合。但我的问题是如何在 eloquent 中进行动态过滤。资源紧随其后。
-
@Zammuuz REST API 基于 CRUD 原则。因此,有必要检索所有用户,因为索引函数是一个 GET 函数。在前端(最好是 VueJS)中执行过滤更有意义。即使对于拥有 10,000 个用户的大页面,检索和传输的时间仍然是可控的。
-
@Zammuuz 关于 Eloquent API 资源,它们基本上可以用于通过实现您可以覆盖的
toArray()方法来促进 transformation of your models and model collections into JSON,所以是的,它们在 之后查询数据库并接收过滤后的模型
标签: laravel laravel-5 eloquent laravel-5.6 laravel-request