【问题标题】:Laravel raw FULLTEXT query similar to Facebook SearchLaravel 原始 FULLTEXT 查询类似于 Facebook 搜索
【发布时间】:2014-01-14 03:31:00
【问题描述】:

我正在 Laravel 4.1 中构建类似于 Facebook 的 AJAX 搜索功能。搜索字段应针对first_namelast_nameemail 搜索users 表。

我可能会输入以下任何条款或条款的一部分,例如:

  • 贾里德
  • 艾特尼尔
  • 贾里德·艾特尼尔
  • jeitnier@domain.com
  • jeit

首先我尝试过:

User::where('email', 'LIKE', $search)
  ->orWhere('first_name', 'LIKE', $search)
  ->orWhere('last_name', 'LIKE', $search)
  ->get();

但这只是匹配其中一个词。然后我尝试用空格分解输入并构建这样的查询:

User::whereRaw("MATCH (first_name, last_name, email)
                AGAINST ('$explode[0]' IN BOOLEAN MODE)
                AND MATCH (first_name, last_name, email)
                AGAINST ('$explode[1]' IN BOOLEAN MODE)")
     ->get();

有效但只能获得完全匹配('jared'、'eitnier' 或 'jared eitnier')

我需要更改哪些内容才能获得 LIKE 匹配项但输入的任何术语组合?

【问题讨论】:

    标签: php mysql laravel


    【解决方案1】:

    我在this post 的帮助下解决了这个问题。这是最终代码:

    $input = Input::get('input');
    
    $exp = explode(' ', $input);
    
    $s = '';
    $c = 1;
    foreach ($exp AS $e)
    {
        $s .= "+$e*";
    
        if ($c + 1 == count($exp))
            $s .= ' ';
    
        $c++;
    }
    
    $query = "MATCH (first_name, last_name, email) AGAINST ('$s' IN BOOLEAN MODE)";
    // $query looks like 
    // MATCH (first_name, last_name, email) AGAINST ('+jar* +eitni*' IN BOOLEAN MODE)
    
    $users = User::whereRaw($query)->get();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-21
      • 1970-01-01
      • 2012-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多