php - 多个搜索词的搜索查询

标签 php mysql sql laravel

我正在运行 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 正在查找由 bossman 组成的用户名。

您可以更改为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/

相关文章:

php - elasticsearch通用查询,适用于任何搜索

mysql - phpmyadmin (mysql) 中列名的计数

mysql - 错误 1215 : cannot add foreign key contraint

未设置 PHP session 变量

javascript - PHP/MySQL : Register isn't creating new users in database

mysql - 我可以有条件地强制执行唯一性约束吗?

MySQL INSERT-SELECT 一个带有 JOIN 的非必填字段

mysql - 将总计数单独计入 M 和 F

SQL Server Management Studio - 在多个数据库中按名称查找存储过程

php - 可以将 memcached 键的生存时间 (TTL) 设置为无限大吗?