Laravel 全文搜索
Laravel full text search
我正在尝试对数据库执行全文搜索查询。这是我的客户发给我的规范:
"The free text search limits the result of the data table to records with a matching first
name, last name, country, city, state, or zip code. If several words are input,
each word must match one of the columns for a record to be visible."
我在我的控制器中做了一些非常丑陋的意大利面条代码来尝试它是否有效:
public function search($searchTerms){
$searchTerms = explode(' ', $searchTerms);
$results = array();
foreach ($searchTerms as $searchTerm) {
if (!People::where('firstname', 'LIKE', '%'.$searchTerm.'%')->get()->isEmpty()) {
array_push($results, People::where('firstname', 'LIKE', '%'.$searchTerm.'%')->get());
}
else if (!People::where('lastname', 'LIKE', '%'.$searchTerm.'%')->get()->isEmpty()) {
array_push($results, People::where('lastname', 'LIKE', '%'.$searchTerm.'%')->get());
}
}
return $results;
}
这是我对这个函数的调用:
$data->people = $this->search(Input::get('search'));
问题是如果没有搜索输入,我用这个来获取所有数据:
$data->people = People::orderBy($order)->paginate(10);
通过将搜索结果作为数组获取,我在视图中收到以下错误:
Undefined property: Illuminate\Database\Eloquent\Collection::$firstname (View: /home/projects/pplproject/app/views/index.blade.php)
Laravel方式应该如何实现?
基本上,这里的目标应该是 运行 这一切都在一个查询中。这里是:
$searchTerms = explode(' ', $searchTerms);
$query = People::query();
foreach($searchTerms as $searchTerm){
$query->where(function($q) use ($searchTerm){
$q->where('firstname', 'like', '%'.$searchTerm.'%')
->orWhere('lastname', 'like', '%'.$searchTerm.'%')
->orWhere('country', 'like', '%'.$searchTerm.'%')
// and so on
});
}
$results = $query->get();
对于相关模型你可以这样尝试:
foreach($searchTerms as $searchTerm){
$query->where(function($q) use ($searchTerm){
$q->where('firstname', 'like', '%'.$searchTerm.'%')
->orWhereHas('relationName', function($relation) use ($searchTerm){
$relation->where('relation_attribute', 'like', '%'.$searchTerm.'%');
});
});
}
试试这个:
$query = People::query();
$searches = explode(' ', $request->query('q'));
if (isset($searches)) {
foreach ($searches as $search) {
$query->where(function ($q) use ($search) {
$q->where('firstname', 'ilike', '%' . $search . '%')
->orWhere('lastname', 'ilike', '%' . $search . '%');
});
}
}
$data = $query->get();
return ([
'success' => true,
'response' => $data,
'message' => 'Your message here'
]);
我正在尝试对数据库执行全文搜索查询。这是我的客户发给我的规范:
"The free text search limits the result of the data table to records with a matching first
name, last name, country, city, state, or zip code. If several words are input,
each word must match one of the columns for a record to be visible."
我在我的控制器中做了一些非常丑陋的意大利面条代码来尝试它是否有效:
public function search($searchTerms){
$searchTerms = explode(' ', $searchTerms);
$results = array();
foreach ($searchTerms as $searchTerm) {
if (!People::where('firstname', 'LIKE', '%'.$searchTerm.'%')->get()->isEmpty()) {
array_push($results, People::where('firstname', 'LIKE', '%'.$searchTerm.'%')->get());
}
else if (!People::where('lastname', 'LIKE', '%'.$searchTerm.'%')->get()->isEmpty()) {
array_push($results, People::where('lastname', 'LIKE', '%'.$searchTerm.'%')->get());
}
}
return $results;
}
这是我对这个函数的调用:
$data->people = $this->search(Input::get('search'));
问题是如果没有搜索输入,我用这个来获取所有数据:
$data->people = People::orderBy($order)->paginate(10);
通过将搜索结果作为数组获取,我在视图中收到以下错误:
Undefined property: Illuminate\Database\Eloquent\Collection::$firstname (View: /home/projects/pplproject/app/views/index.blade.php)
Laravel方式应该如何实现?
基本上,这里的目标应该是 运行 这一切都在一个查询中。这里是:
$searchTerms = explode(' ', $searchTerms);
$query = People::query();
foreach($searchTerms as $searchTerm){
$query->where(function($q) use ($searchTerm){
$q->where('firstname', 'like', '%'.$searchTerm.'%')
->orWhere('lastname', 'like', '%'.$searchTerm.'%')
->orWhere('country', 'like', '%'.$searchTerm.'%')
// and so on
});
}
$results = $query->get();
对于相关模型你可以这样尝试:
foreach($searchTerms as $searchTerm){
$query->where(function($q) use ($searchTerm){
$q->where('firstname', 'like', '%'.$searchTerm.'%')
->orWhereHas('relationName', function($relation) use ($searchTerm){
$relation->where('relation_attribute', 'like', '%'.$searchTerm.'%');
});
});
}
试试这个:
$query = People::query();
$searches = explode(' ', $request->query('q'));
if (isset($searches)) {
foreach ($searches as $search) {
$query->where(function ($q) use ($search) {
$q->where('firstname', 'ilike', '%' . $search . '%')
->orWhere('lastname', 'ilike', '%' . $search . '%');
});
}
}
$data = $query->get();
return ([
'success' => true,
'response' => $data,
'message' => 'Your message here'
]);