2013-11-26 5 views
1

Я видел немало статей по полнотекстовому поиску в Laravel, где пользователи рекомендуют использовать whereRaw (...) или DB :: query (...), но моя цель - сохранить базу данных агностик. Я понимаю, что где ('col', 'like', '% foo%') ужасно w.r.t. представление.Laravel 4 и полнотекстовый поиск

Так что, я считаю, что я оставил создание собственного индекса базы данных. Есть ли что-то, что я могу сделать из коробки с Laravel или какой-либо структурой таблицы, которую я могу настроить для создания более быстрого механизма поиска?

В настоящее время у меня есть «главная» таблица с текстовыми столбцами «данные», на которых я планирую запустить поиск. Это единственный столбец, на котором я занимаюсь поиском.

+1

Длинная (но лучше) дорога будет использовать поисковую систему, такую ​​как Lucene (реализация PHP из Zend: http://framework.zend.com/manual/1.12/en/zend.search.lucene.html). –

ответ

1

Вот функция, которую я использую для простого полнотекстового serach с laravel. Если вы используете mysql rememeber для установки движка на MyISAM в таблице.

У меня есть эта функция в файле модели, чтобы я мог вызвать User :: serachFilter ('query'); от контроллера.

public static function searchFilter($data, $pageLimit = '5') 
    { 
     $keyword = !is_array($data) ? array('+'.$data.'*') : $data; 
     $matchArray = array('firstName', 'lastName', 'location', 'address'); 
     $columns = array(); 
     foreach($matchArray as $column) 
     { 
      $columns[] = $column; 
     } 
     $match = implode(',', $columns); 
     $result = self::whereRaw('MATCH('.$match.') AGAINST (? IN BOOLEAN MODE)', $keyword) 
        ->paginate($pageLimit); 

     return $result; 
    } 

Edit: Поскольку вы diden't хотите использовать whereRaw, тест

$query = Input::get('search'); 
    $pageLimit = Input::get('page_limit'); 

    $search = DB::select(" 
     select * 
     from users 
     where match(id, name, email, username) 
     against('+{$query}*' IN BOOLEAN MODE) 
     limit {$pageLimit} 
    "); 

    return $search; 
+0

Спасибо за ваш ответ, однако, я хочу избежать использования whereRaw, поскольку он действительно не создает запрос на основе базового механизма базы данных. –

5

, если запросы не проблема, это то, как Я сделал это.

Во-первых, включают в себя поисковую форму на ваш взгляд:

{{ Form::open(['method' => 'get']) }} 
{{ Form::text('q',Input::get('q')) }} 
{{ Form::submit('Search') }} 
{{ Form::close() }} 

Убедитесь в таблице вы хотите найти это MyISAM, вы можете сделать это, добавив в миграции:

$table->engine = 'MYISAM'; 

После этого добавьте эту область в свою модель и измените столбцы, которые вы хотите найти:

public function scopeSearch($query,$q) { 
    return empty($q) ? $query : $query->whereRaw(
    "MATCH(title,contents,anotherfield) 
     AGAINST(? IN BOOLEAN MODE)",[$q]); 
} 

I n ваш контроллер, просто добавьте область при извлечении данных:

$posts = Posts::search(Input::get('q'))->get(); 

И это должно сработать. В случае, если вам нужно добавить нумерацию страниц, сделать что-то вроде этого:

$posts = Posts::search(Input::get('q'))->paginate(30); 

И для показа ссылок в представлении, используйте этот код:

{{ $posts->appends(Input::except('page'))->links() }} 

Это сохранит все ГЭТ Params (включая параметр запроса) при разбиении на страницы.

Смежные вопросы