Laravel 5.6 Api-搜索,排序和过滤数据列表

时间:2018-07-27 10:23:31

标签: laravel laravel-5 eloquent laravel-5.6 laravel-request

嗨,我正在开发一个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;
}

3 个答案:

答案 0 :(得分:1)

无论如何,我修复了它,创建了另一个发布终结点,它将发送所有带有其值的过滤器。我不确定这是否正确,但是现在我只能想到这样。

更新

大家好,我已经按照以下教程实施了过滤器。

https://m.dotdev.co/writing-advanced-eloquent-search-query-filters-de8b6c2598db

答案 1 :(得分:0)

我将通过以下方式更改您存储库的代码:

public function getAllUsers($request)
{
    // Set query builder
    $qb = User::query();
    if($request->has('q')){
        $qb->ofSearch($q);
    }
    if($request->has('sortby')){
        //Handle default parameter of get with second argument
        $qb->orderBy($request->get('sortBy'), $request->get('direction', 'ASC'));
    }

    return $qb->paginate();
}

Request :: get方法句柄isset为您检查!

答案 2 :(得分:0)

使用Laravel API(在Laravel 5.x和6.1中测试)对谁需要排序和过滤数据库数据的简单解决方案。

首先: 在数据库中创建表。您可以针对测试建议手动进行此操作,但我建议您遵循以下步骤:https://laravel.com/docs/5.7/migrations

在该示例中,表被命名为“ my_task”;

然后在根目录Laravel中创建您的模型:

-> (返回:模型创建成功。)

将在应用目录中创建模型。

接下来,在Laravel根目录中键入以下内容来创建您的Controller:

php artisan make:model MyTask (返回:控制器创建成功。)

将在php artisan make:controller MyTaskController内部创建控制器 之后,将以下代码插入控制器app/Http/Controllers/文件中:

MyTaskController.php

最后: 在<?php namespace App\Http\Controllers; use App\MyTask; use DB; use Illuminate\Http\Request; class MyTaskController extends Controller { public function filter($parameter) { $filter = DB::table('my_task') ->where('field123', '=', $parameter) ->get(); return $filter; } } 文件中添加指向您的控制器的路由:

routes/api.php

使用浏览器或邮递员测试端点:

Route::get("my-task/{parameter}", "MyTaskController@filter");

“值”上方的url中是您要在数据库“我的任务”表中查找的值。

Ps:您可以创建指向相同控制器内其他功能的新路由,以进行其他类型的操作,例如“排序”。