$termString .= $term . '* ';
}
$fields = implode(',', $fieldsToSearch);
- $search = static::whereRaw('MATCH(' . $fields . ') AGAINST(? IN BOOLEAN MODE)', [$termString]);
+ $termStringEscaped = \DB::connection()->getPdo()->quote($termString);
+ $search = static::addSelect(\DB::raw('*, MATCH(name) AGAINST('.$termStringEscaped.' IN BOOLEAN MODE) AS title_relevance'));
+ $search = $search->whereRaw('MATCH(' . $fields . ') AGAINST(? IN BOOLEAN MODE)', [$termString]);
+
+ // Add additional where terms
foreach ($wheres as $whereTerm) {
$search->where($whereTerm[0], $whereTerm[1], $whereTerm[2]);
}
- if (!static::isA('book')) {
- $search = $search->with('book');
- }
-
- if (static::isA('page')) {
- $search = $search->with('chapter');
- }
+ // Load in relations
+ if (!static::isA('book')) $search = $search->with('book');
+ if (static::isA('page')) $search = $search->with('chapter');
- return $search->get();
+ return $search->orderBy('title_relevance', 'desc')->get();
}
/**
--- /dev/null
+<?php
+
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Database\Migrations\Migration;
+
+class FulltextWeighting extends Migration
+{
+ /**
+ * Run the migrations.
+ *
+ * @return void
+ */
+ public function up()
+ {
+ DB::statement('ALTER TABLE pages ADD FULLTEXT name_search(name)');
+ DB::statement('ALTER TABLE books ADD FULLTEXT name_search(name)');
+ DB::statement('ALTER TABLE chapters ADD FULLTEXT name_search(name)');
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::table('pages', function(Blueprint $table) {
+ $table->dropIndex('name_search');
+ });
+ Schema::table('books', function(Blueprint $table) {
+ $table->dropIndex('name_search');
+ });
+ Schema::table('chapters', function(Blueprint $table) {
+ $table->dropIndex('name_search');
+ });
+ }
+}