Mysql полнотекстовый поиск с Laravel Переводим? - PullRequest
0 голосов
/ 07 мая 2020

До сих пор я всегда использовал полнотекстовый поиск вроде этого:

public function posts($search)
{
    $searchString = $this->prepareString($search);
    $posts = Post::select('*')->selectRaw('MATCH(name) AGAINST(? IN NATURAL LANGUAGE MODE) AS relevance', [$searchString])->whereRaw('MATCH(name) AGAINST(? IN NATURAL LANGUAGE MODE)', [$searchString])->orderBy('relevance', 'desc')->get();

    return $posts;
}

И это отлично работает, однако теперь я использую этот пакет Laravel Translatable. И поле name не является частью сообщения, но оно является частью PostTranslation. Как я могу использовать вышеуказанный запрос, кроме как для перевода? Вот мои миграции:

Schema::create('posts', function (Blueprint $table) {
            $table->increments('id');
            $table->timestamps();
        });
Schema::create('post_translations', function (Blueprint $table) {
            $table->increments('id');

            $table->string('name');
            $table->text('body');

            $table->char('locale', 2)->index();

            $table->integer('post_id')->unsigned();
            $table->foreign('post_id')->references('id')->on('posts')->onDelete('cascade');

            $table->unique(['id', 'locale']);
        });

Ответы [ 2 ]

0 голосов
/ 07 мая 2020

Laravel похоже, не поддерживает индексы FULLTEXT, которые должны быть указаны при миграции с использованием схемы таблицы. Однако вы можете просто добавить их вручную, используя необработанные запросы:

Schema::create('post_translations', function (Blueprint $table) {
    $table->increments('id');

    $table->string('name');
    $table->text('body');

    $table->char('locale', 2)->index();

    $table->integer('post_id')->unsigned();
    $table->foreign('post_id')->references('id')->on('posts')->onDelete('cascade');

    $table->unique(['id', 'locale']);
});
DB::statement('ALTER TABLE post_translations ADD FULLTEXT idx(name)');

Затем вы можете просто использовать полнотекстовый поиск как обычно:

$posts = PostTranslation::select('*')
    ->selectRaw(
      'MATCH(name) AGAINST(? IN NATURAL LANGUAGE MODE) AS relevance', 
      [$searchString]
    )->whereRaw(
       'MATCH(name) AGAINST(? IN NATURAL LANGUAGE MODE)', 
       [$searchString]
    )->orderBy('relevance', 'desc')->get();
0 голосов
/ 07 мая 2020

Вы можете использовать DB Фасад примерно так

public function posts($search)
{
    $searchString = $this->prepareString($search);
    $posts = DB::table('post_translations')->select('*')->selectRaw('MATCH(name) AGAINST(? IN NATURAL LANGUAGE MODE) AS relevance', [$searchString])->whereRaw('MATCH(name) AGAINST(? IN NATURAL LANGUAGE MODE)', [$searchString])->orderBy('relevance', 'desc')->get();

    return $posts;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...