我正在运行 Laravel 5 并构建了一个小型搜索功能:
$q = Input::get('q');
$search_terms = explode(' ', $q);
$user_query = User::select();
$news_query = Article::select();
foreach ($search_terms as $term) {
$user_query->where('username', 'like', '%' . $term . '%');
$news_query->where('title', 'like', '%' . $term . '%');
}
$user_results = $user_query->get();
$news_results = $news_query->get();
return view('search', ['q' => $q, 'user_results' => $user_results, 'news_results' => $news_results]);
它适用于一个搜索词,但不适用于多个词。
示例:
- “boss”返回包含“boss”的用户和新闻项
- “boss man”返回包含“boss”的用户和新闻项
- “man boss”返回包含“man”的用户和新闻项
如何进行调整,以便返回包含“boss”或“man”的用户和新闻项目?
最佳答案
现在,您的查询是使用 and
语句执行的,因此 MySQL 正在查找由 boss
和 man
组成的用户名。
您可以更改为orWhere()
,它应该可以立即工作。这是我使用您的代码在 Tinker 中进行的快速实验:
$terms = explode(' ', 'c a');
$user_query = User::select();
foreach ($terms as $term) {
$user_query->orWhere('username', 'like', '%' . $term . '%');
}
$user_results = $user_query->get();
$user_results->toArray();
// array(
// 0 => array(
// 'id' => 2,
// 'username' => 'christopher',
// 'created_at' => '2014-04-27 18:41:56',
// 'updated_at' => '2014-11-07 13:42:58',
// 'remember_token' => NULL
// ),
// 1 => array(
// 'id' => 4,
// 'username' => 'Kalle',
// 'created_at' => '2014-11-07 13:42:55',
// 'updated_at' => '2014-11-07 13:42:55',
// 'remember_token' => NULL
// )
// )
关于php - 多个搜索词的搜索查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30388372/