【问题标题】:Laravel 5.6 Api - Search,sort and filter on list of dataLaravel 5.6 Api - 搜索、排序和过滤数据列表
【发布时间】: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


【解决方案1】:

我会以这种方式更改您的存储库的代码:

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 方法句柄为您检查!

【讨论】:

  • 嗨卢卡斯,谢谢你的回答。我一定会试一试的。但这只是我修改后的代码。我的问题是如何处理 api 中的动态多个过滤器?
【解决方案2】:

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

更新

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

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

【讨论】:

    【解决方案3】:

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

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

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

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

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

    模型将在 app 目录中创建。

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

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

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

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

    在上面的url中,“value”是你要在数据库my-task表中查找的值。

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

    【讨论】:

    • 在 API 中,路由 my-task/{parameter}{parameter} 应该是 id 中的一个 my-task
    猜你喜欢
    • 2021-06-06
    • 2017-05-29
    • 2020-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    • 2010-12-27
    • 2019-04-22
    相关资源
    最近更新 更多