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

时间:2015-07-29 15:38:06

标签: laravel laravel-5 eloquent

我的资源管理器中有以下代码块:

$travel_company_id = Input::get('travel_company_id');
$transport_type = Input::get('transport_type');
$route_type = Input::get('route_type');

$travelRoutes = TravelRoute::where('travel_company_id', $travel_company_id)
                        ->where('transport_type', $transport_type)
                        ->where('route_type', $route_type)
                        ->get();

现在它的作用是根据提供的参数得到 travelRoutes 。我想要它做的是基于可用参数执行搜索,这样如果 $ route_type 为空,搜索将仅在travel_company_id和传输类型上执行

如果所有参数为空,那么它只会执行get并返回所有可用记录。

我知道我可以用很多if语句来做这个但是如果我在前端添加一个新参数我也必须将它添加到后端,我想知道是否有一个更简单< / strong>以及在laravel中执行此操作的更短方式。

2 个答案:

答案 0 :(得分:3)

where方法接受一系列约束:

$constraints = array_only(Input::all(), [
    'travel_company_id',
    'transport_type',
    'route_type',
]);

$routes = TravelRoute::where($constraints)->get();

警告使用Input::only()代替array_only()。他们不一样。

Input::only()使用null填写任何遗失的内容,这不是您想要的内容。

答案 1 :(得分:2)

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

/**
 * Search fields to retrieve and search the database with. Assumed they match the 
 * column names in the database
 */
private function getSearchFields()
{
    return ['travel_company_id', 'transport_type', 'route_type'];
}

public function search()
{
    // Get a new query instance from the model
    $query = TravelRoute::query();

    // Loop through the fields checking if they've been input, if they have add 
    //  them to the query.
    foreach($this->getSearchFields() as $field)
    {
        if (Input::has($field))
        {
            $query->where($field, Input::get($field));
        }
    }

    // Finally execute the query
    $travelRoutes = $query->get();
}