Php 在一个laravel中组合多个API

Php 在一个laravel中组合多个API,php,api,eloquent,laravel-5.4,Php,Api,Eloquent,Laravel 5.4,这个月我开始学习laravel,学习API,只学习控制器和模型 我有一些API,比如按名称、类型、区域、评级、评论进行搜索 每个都响应这些URL localhost:8000/api/vendors/name/test 本地主机:8000/api/供应商/类型/学生 本地主机:8000/api/供应商/地区/亚洲 我在这里面临一个大问题,我有大约10个字段可以单独搜索,但问题是它们可以在一个查询中搜索,比如名称和类型、名称和区域、名称类型和区域、名称类型区域和评论。将有许多组合 我现在在控制器中

这个月我开始学习laravel,学习API,只学习控制器和模型

我有一些API,比如按名称、类型、区域、评级、评论进行搜索 每个都响应这些URL

localhost:8000/api/vendors/name/test

本地主机:8000/api/供应商/类型/学生

本地主机:8000/api/供应商/地区/亚洲

我在这里面临一个大问题,我有大约10个字段可以单独搜索,但问题是它们可以在一个查询中搜索,比如名称和类型、名称和区域、名称类型和区域、名称类型区域和评论。将有许多组合

我现在在控制器中使用了一种不同的方法。但我觉得这种方式很难为每个查询创建不同的方法

我的问题是,有没有办法简单地合并这些查询,比如有一个相对调用不同方法的方法。 像名称类型和区域一样,方法首先调用名称,它得到一些结果,现在在结果类型上调用方法,在结果区域上调用方法

现在我的api.php是这样的

Route::get('/vendors/name/{name}','VendorsController@ByName');
Route::get('/vendors/type/{type}','VendorsController@ByType');
Route::get('/vendors/area/{area}','VendorsController@ByArea');
Route::get('/vendors/rating/{rating}','VendorsController@ByRating');
Route::get('/vendors/reviews/{reviews}','VendorsController@ByReviews');

Route::get('/vendors/name/{name}/type/{type}','VendorsController@ByNameType');
Route::get('/vendors/name/{name}/area/{area}','VendorsController@ByNameArea');
Route::get('/vendors/type/{type}/area/{area}','VendorsController@ByTypeArea');

Route::get('/vendors/name/{name}/type/{type}/area/{area}','VendorsController@ByNameTypeArea');
并且控制器文件是

public function ByName($Name)
{
    $Vendors = Vendors::where('Name', 'like', '%'.$Name.'%')
    ->with('venues')->paginate(30);
    return $Vendors;
}

public function ByType($Type)
{
    $Types = explode('-', $Type);

    $Vendors = Vendors::whereIn('Type', $Types)
    ->with('venues')->paginate(30);
    return $Vendors;
}

public function ByArea($Area)
{
    $Vendors = Vendors::where('Area', 'like', '%'.$Area.'%')
    ->with('venues')->paginate(30);
    return $Vendors;
}

public function ByRating($Rating)
{
    $Ratings = explode('-', $Rating);

    $Vendors = Vendors::whereBetween('Rating', $Ratings)
    ->with('venues')->paginate(30);
    return $Vendors;
}

public function ByReviews($Review)
{
    $Reviews = explode('-', $Review);

    $Vendors = Vendors::whereBetween('Reviews', $Reviews)
    ->with('venues')->paginate(30);
    return $Vendors;
}

public function ByNameType($Name, $Type)
{
    $Types = explode('-', $Type);

    $Vendors = Vendors::where('Name', 'like', '%'.$Name.'%')
    ->whereIn('Type', $Types)
    ->with('venues')->paginate(30);
    return $Vendors;
}

public function ByNameArea($Name, $Area)
{
    $Vendors = Vendors::where('Name', 'like', '%'.$Name.'%')
    ->where('Area', 'like', '%'.$Area.'%')
    ->with('venues')->paginate(30);
    return $Vendors;
}

public function ByTypeArea($Type, $Area)
{
    $Types = explode('-', $Type);

    $Vendors = Vendors::where('Area', 'like', '%'.$Area.'%')
    ->whereIn('Type', $Types)
    ->with('venues')->paginate(30);
    return $Vendors;
}

public function ByNameTypeArea($Name, $Type, $Area)
{
    $Types = explode('-', $Type);

    $Vendors = Vendors::where('Name', 'like', '%'.$Name.'%')
    ->where('Area', 'like', '%'.$Area.'%')
    ->whereIn('Type', $Types)
    ->with('venues')->paginate(30);
    return $Vendors;
}

一个建议是为all添加slug,为可能的值声明一个数组,然后检查slug是否在数组中,如果在数组中,然后继续为此编写查询。这可以最大限度地减少使用的函数数量。我有另一个想法,尝试使用GET参数进行搜索,将添加多个检查。这将在1种方法中完成?