Mysql 全文搜索 Laravel 可翻译?
Mysql full text search with Laravel Translatable?
到目前为止,我一直使用这样的全文搜索:
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
字段不是 Post 的一部分,但它是 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']);
});
你可以使用 DB
Facade 这样的东西
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;
}
Laravel 似乎不支持使用 table 蓝图在迁移中指定 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]
)->orderBy('relevance', 'desc')->get();
到目前为止,我一直使用这样的全文搜索:
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
字段不是 Post 的一部分,但它是 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']);
});
你可以使用 DB
Facade 这样的东西
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;
}
Laravel 似乎不支持使用 table 蓝图在迁移中指定 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]
)->orderBy('relevance', 'desc')->get();