Laravel Larvel—在';其中';条款

Laravel Larvel—在';其中';条款,laravel,laravel-5,eloquent,Laravel,Laravel 5,Eloquent,我有这样一个搜索查询: $data = User::where('first_name', 'like', '%'.$query.'%') ->orWhere('last_name', 'like', '%'.$query.'%') ->get(); 现在,我有很多模型,每个都有不同的列名。我不想在每个控制器中定义search()函数,而是想执行以下操作: // User public static function searchableFields() { r

我有这样一个搜索查询:

$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();
$data = User::matchingSearch($query)->get();
我怎样才能做到这一点


非常感谢。

你可以试试这样的东西

//控制器

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;
}

你可以试试这样的

//控制器

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;
}

您可以在字段上循环,并将它们逐个添加到您的雄辩查询中

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

您可以在字段上循环,并将它们逐个添加到您的雄辩查询中

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

我会用这个范围

您可以创建所有模型都应扩展的基础模型(此模型应扩展Elount模型),并在此模型中添加以下方法:

public function scopeMatchingSearch($query, $string)
{
   $query->where(function($q) use ($string) {
       foreach (static::searchableFields() as $field) {
          $q->orWhere($field, 'LIKE',  '%'.$string.'%');
       }
   });
}
现在,您可以进行如下搜索:

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

为了避免混淆-
$query
传递给
matchingSearch
的参数在此方法中成为
$string
参数。

我将使用范围

您可以创建所有模型都应扩展的基础模型(此模型应扩展Elount模型),并在此模型中添加以下方法:

public function scopeMatchingSearch($query, $string)
{
   $query->where(function($q) use ($string) {
       foreach (static::searchableFields() as $field) {
          $q->orWhere($field, 'LIKE',  '%'.$string.'%');
       }
   });
}
现在,您可以进行如下搜索:

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

为了避免混淆-
$query
传递给
matchingSearch
的参数在此方法中变为
$string
参数。

通常列名不能是查询中的参数,没有动态SQL也是如此。为什么列出一些列对您来说是个问题?通常,如果没有动态SQL,列名不能作为查询中的参数。为什么列出一些列对您来说是个问题?但是这将执行与关键字一样多的查询,并且有很多不必要的代码。但是这将执行与关键字一样多的查询,并且有很多不必要的代码。谢谢Jerodev!这正是我想要的。它就像一个符咒!很高兴我能帮忙。考虑把这个问题作为你的问题的解决方案,这样其他用户也会发现这个问题。“奥斯卡知道这个解决方案可能会损坏你,如果你使用软删除或应用一些全局范围。Hi @ McCnNabiaEK,我可以用软损坏或其他条件,比如$data=$Quest-> TrasHead())-> GET()奥斯卡:是的,你可以。最重要的是,无论何时使用
或where
,都应该像我在回答中所显示的那样,将它们包装在
where
闭包中。否则,迟早会从数据库中获取无效数据,可能很难检测到问题。谢谢Jerodev!这正是我想要的。它就像一个符咒!很高兴我能帮忙。考虑把这个问题作为你的问题的解决方案,这样其他用户也会发现这个问题。“奥斯卡知道这个解决方案可能会损坏你,如果你使用软删除或应用一些全局范围。Hi @ McCnNabiaEK,我可以用软损坏或其他条件,比如$data=$Quest-> TrasHead())-> GET()奥斯卡:是的,你可以。最重要的是,无论何时使用
或where
,都应该像我在回答中所显示的那样,将它们包装在
where
闭包中。否则,迟早会从数据库中获取无效数据,可能很难检测到问题。