嗨,我正在开发一个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;
}
答案 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:您可以创建指向相同控制器内其他功能的新路由,以进行其他类型的操作,例如“排序”。