Laravel 5.6 Api - 对数据列表进行搜索、排序和过滤

Laravel 5.6 Api - Search,sort and filter on list of data

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

我将这样更改您存储库的代码:

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 为您检查!

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

更新

我已经按照下面的教程实现了过滤器。

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

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

首先: 在数据库中创建您的 table。您可以为测试提案手动执行此操作,但我建议遵循以下操作:https://laravel.com/docs/5.7/migrations

在该示例中,table 被命名为 'my_task';

然后在根 Laravel 目录中输入您的模型:

php artisan make:model MyTask(return:模型创建成功。)

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

接下来,在根 Laravel 目录中输入控制器:

php artisan make:controller MyTaskController(return:控制器创建成功。)

控制器将在内部创建 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");

使用浏览器或 Postman 测试您的端点:

http://127.0.0.1/api/my-task/value

上面url中的"value"就是你要在数据库my-task中查找的值table.

Ps:你可以在同一个控制器中创建指向其他函数的新路由,以进行其他类型的操作,如'sort'。