В этом руководстве я опишу создание полнотекстового поиска в Laravel 4. Те из вас, кто работал с Laravel 3, могут вспомнить, что в нем была поддержка %%(t)FULLTEXT%%-индексов. Эта функциональность была удалена из Laravel 4, но по-прежнему может быть легко реализована. Однако имейте в виду, что полнотекстовый поиск совместим не с каждым сервером баз данных, или может работать с ними по-разному. Это стало главной причиной его удаления из Laravel 4. Но если вы работаете с MySQL, то вы можете использовать такой поиск без проблем! ==Что надо знать о полнотекстовом поиске== MySQL поддерживает полнотекстовое индексирование и поиск: * Полнотекстовый индекс в MySQL - это индекс типа %%(t)FULLTEXT%%. * Полнотекстовые индексы могут использоваться только с таблицами MyISAM. (А в MySQL 5.6 и выше они также могут использоваться с таблицами InnoDB). Полнотекстовые индексы могут быть созданы только для столбцов %%(t)CHAR%%, %%(t)VARCHAR%% или %%(t)TEXT%%. * Описание %%(t)FULLTEXT%%-индекса может быть дано в операторе %%(t)CREATE TABLE%%, когда таблица создается, или добавлено позднее с помощью %%(t)ALTER TABLE%% или %%(t)CREATE INDEX%%. * Для больших наборов данных намного быстрее загрузить данные в таблицу, у которой нет %%(t)FULLTEXT%% индекса, и после этого создать индекс, чем загружать данные в таблицу, у которой уже есть %%(t)FULLTEXT%% индекс. ==Как использовать полнотекстовый поиск в Laravel== Для того чтобы начать применять полнотекстовый поиск в Laravel 4, мы позаботимся о нескольких вещах: * Если вы используете не MySQL 5.6+, мы должны выбрать в качестве движка базы данных **MyISAM** вместо **InnoDB**. * Мы должны настроить миграцию и добавить //полнотекстовый индекс//. * Мы должны добавить функцию поиска в наш контроллер. ==Миграция нашей таблицы== Миграция нашей таблицы проста. Мы можем использовать следующую схему для задания столбцов //title// и //body// в качестве %%(t)FULLTEXT%%-индекса таблицы //posts//: %% engine = 'MyISAM'; // внимание: вы не сможете использовать внешние ключи (foreign keys) $table->increments('id'); $table->string('title'); $table->text('body'); $table->timestamps(); }); DB::statement('ALTER TABLE posts ADD FULLTEXT search(title, body)'); } /** * Откат миграций. * * @return void */ public function down() { Schema::table('posts', function($table) { $table->dropIndex('search'); }); Schema::drop('posts'); } } %% В приведенном коде вы можете увидеть, что мы также выбрали движок хранилища **MyISAM** в миграции. Индекс **FULLTEXT** задан после создания таблицы с помощью оператора %%(t)ALTER TABLE%%. В функции **down()** мы сначала удаляем полнотекстовый индекс, а затем удаляем таблицу. ==Добавление функции поиска в наш контроллер== Дальше нам надо добавить функцию поиска в наш контроллер. Для этого мы будем использовать запрос //POST//. Назовем функцию **postSearch**, чтобы обращаться к ней соответственно. %% public function postSearch() { $q = Input::get('query'); $posts = $this->post->whereRaw( "MATCH(title,body) AGAINST(? IN BOOLEAN MODE)", array($q) )->get(); return View::make('posts.index', compact('posts')); } %% Теперь, например, если параметр вашего **запроса** будет //"testing"//, вы получите следующий MySQL-запрос: %%(sql) SELECT * FROM `posts` WHERE MATCH(title,body) AGAINST('testing' IN BOOLEAN MODE); %% В этом примере я также беру результат и передаю его в мое представление //index//. Вы точно также можете использовать другое представление. ==Добавление маршрута и изменение представления== Мы создаём наш маршрут так: %% Route::post( 'posts/search', array( 'as' => 'posts.search', 'uses' => 'PostsController@postSearch' ) ); %% И мы можем создать простую форму в представлении так: %%(html) %% Все, что нам для этого нужно, это текстовое поле с параметром //name//, с установленным значением **query** (или любой, который вы решили выбрать в качестве входного имени в вашем контроллере). ==Вот и всё!== Теперь вы знаете, как применять полнотекстовый поиск MySQL в Laravel 4. Если вам понравилось это руководство, обязательно поделитесь им в социальных сетях. Не стесняйтесь оставлять отзывы или вопросы в комментариях.