我有这样的搜索查询:
$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();
我怎样才能做到这一点?
非常感谢。
答案 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;
}