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