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
闭包中。否则,迟早会从数据库中获取无效数据,可能很难检测到问题。