Laravel - 在'where'子句中传递列数组

时间:2017-12-13 08:09:01

标签: laravel laravel-5 eloquent

我有这样的搜索查询:

$data = User::where('first_name', 'like', '%'.$query.'%')
   ->orWhere('last_name', 'like', '%'.$query.'%')
   ->get();

现在,我有很多模型,每个模型都有不同的列名。我没有在每个控制器中定义search()函数,而是希望这样做:

// User
public static function searchableFields()
{
    return ['first_name', 'last_name'];
}

// Some other model
public static function searchableFields()
{
    return ['name', 'description'];
}

将搜索逻辑放在共享控制器中,如下所示:

$data = $classname::
    where($classname::searchableFields(), 'like', '%'.$query.'%')
    ->get();

我怎样才能做到这一点?

非常感谢。

3 个答案:

答案 0 :(得分:1)

您可以遍历这些字段并将它们逐个添加到您的Eloquent查询中。

$data = $classname::where(function ($query) use ($classname) {
    foreach ($classname::searchableFields() as $field)
        $query->orWhere($field, 'like', '%' . $query . '%');
})->get();

答案 1 :(得分:1)

我会使用范围。

你可以创建所有模型都应该扩展的基础模型(这个模型应该扩展Eloquent模型),在这个模型中你应该添加这样的方法:

$data = User::matchingSearch($query)->get();

现在你可以进行这样的搜索:

$query

为避免混淆 - 传递给matchingSearch的{​​{1}}参数在此方法中变为$string参数。

答案 2 :(得分:0)

你可以尝试这样的事情。

//控制器

function getIndex(Request $request)
{
    $this->data['users'] = User::orderBy('first_name','asc')->get();

    if ($request->has('keyword')) {
        $results             = User::search($request->keyword);
        $this->data['users'] = collect([$results])->collapse()->sortBy('first_name');
    }
}

//型号

function search($keyword)
{
    $results     = [];
    $search_list =  ['first_name','last_name'];
    foreach ($search_list as $value)
    {
        $search_data = User::where($value,'LIKE','%'.$keyword.'%')->get();
        foreach ($search_data as $search_value) {
            $exist = 0;
            if (count($results)) {
                foreach ($results as $v) {
                    if ($search_value->id == $v->id) {
                        $exist++;
                    }
                }
                if ($exist == 0) {
                    $results[] = $search_value;
                }
            } else{
                $results[] = $search_value;
            }
        }
    }
    return $results;
}