Laravel 使用带有可选查询参数的eloquent从数据库检索记录

Laravel 使用带有可选查询参数的eloquent从数据库检索记录,laravel,laravel-5,eloquent,Laravel,Laravel 5,Eloquent,我的资源控制器中有以下代码块: $travel\u company\u id=Input::get('travel\u company\u id'); $transport_type=Input::get('transport_type'); $route_type=Input::get('route_type'); $travelRoutes=TravelRoute::where('travel\u company\u id',$travel\u company\u id) ->其中('运输类

我的资源控制器中有以下代码块:

$travel\u company\u id=Input::get('travel\u company\u id');
$transport_type=Input::get('transport_type');
$route_type=Input::get('route_type');
$travelRoutes=TravelRoute::where('travel\u company\u id',$travel\u company\u id)
->其中('运输类型',$运输类型)
->其中('route_type',$route_type)
->get();
现在,它根据提供的参数获取旅行路线。我想让它做的是根据可用参数执行搜索,这样如果$route\u type为空,搜索将仅对旅行公司id和交通类型执行

另外,如果all参数为空,则它只需执行get并返回所有可用记录


我知道我可以用很多if语句来实现这一点,但是如果我在前端添加一个新参数,我也必须将它添加到后端,我想知道在laravel中是否有一种更简单、更短的方法来实现这一点。

这是一种非常粗糙的方法,如果您花一些时间开发一个解决方案,我相信它会更好。这假设
getSearchFields()
函数中的所有字段都与表单和数据库中的输入名称匹配

/**
*用于检索和搜索数据库的搜索字段。假设他们符合
*数据库中的列名
*/
私有函数getSearchFields()
{
返回['travel_company_id'、'transport_type'、'route_type'];
}
公共函数搜索()
{
//从模型中获取新的查询实例
$query=TravelRoute::query();
//循环检查字段是否已输入,是否已添加
//将它们添加到查询中。
foreach($this->getSearchFields()作为$field)
{
if(输入::has($field))
{
$query->where($field,Input::get($field));
}
}
//最后执行查询
$travelRoutes=$query->get();
}

这是一个相当粗糙的问题,如果你花些时间开发一个解决方案,我相信它会更好。这假设
getSearchFields()
函数中的所有字段都与表单和数据库中的输入名称匹配

/**
*用于检索和搜索数据库的搜索字段。假设他们符合
*数据库中的列名
*/
私有函数getSearchFields()
{
返回['travel_company_id'、'transport_type'、'route_type'];
}
公共函数搜索()
{
//从模型中获取新的查询实例
$query=TravelRoute::query();
//循环检查字段是否已输入,是否已添加
//将它们添加到查询中。
foreach($this->getSearchFields()作为$field)
{
if(输入::has($field))
{
$query->where($field,Input::get($field));
}
}
//最后执行查询
$travelRoutes=$query->get();
}

其中的
方法接受一系列约束:

$constraints=array_only(输入::all()[
“旅行公司id”,
“运输类型”,
“路线类型”,
]);
$routes=TravelRoute::where($constraints)->get();
警告:不要使用
Input::only()
而不是
array\u only()
。他们不一样


Input::only()
null
填充任何缺少的项,这不是您想要的。

where
方法接受一系列约束:

$constraints=array_only(输入::all()[
“旅行公司id”,
“运输类型”,
“路线类型”,
]);
$routes=TravelRoute::where($constraints)->get();
警告:不要使用
Input::only()
而不是
array\u only()
。他们不一样


Input::only()
null
填充任何缺少的项目,这不是您想要的。

哇,这太棒了!我的javascript api向未定义的参数传递“未定义”时出现问题,因为我将它们硬编码到url中,导致其无法工作,但我在此处找到了解决方案:。再次感谢:我一定会采用这个作为将来的使用+1哇,这真是太棒了!我的javascript api向未定义的参数传递“未定义”时出现问题,因为我将它们硬编码到url中,导致其无法工作,但我在此处找到了解决方案:。再次感谢:我一定会采用这个作为将来的使用+1谢谢你,但约瑟夫·西布勒的解决方案似乎简单得多,效果也很好。除非您的解决方案具有更好的性能,否则反复调用
Input::get()
Input::has()
是非常低效的。谢谢您,但是Joseph Sibler的解决方案似乎简单得多,而且效果也很好。除非您的解决方案具有更好的性能,否则反复调用
Input::get()
Input::has()
效率极低。