Создание поля FULLTEXT в миграции схемы - PullRequest
0 голосов
/ 02 сентября 2018

Я делаю пакет Laravel в первую очередь для внутреннего использования в проекте, но я наткнулся на небольшую загадку ...

Я добавляю полнотекстовый столбец searchable к каждой модели, которую необходимо найти. Я использую нативные функции миграции Laravel, вот так -

Schema::table('assets', function (Blueprint $table) {
    Searchable::migrateUp($table, 'moderated');
});

Таким образом, вызывается метод для развертывания миграции после столбца moderated. Вот как выглядит этот метод -

public function migrateUp(Blueprint $table, $after = null)
{

    // add our searchable column
    $table
        ->longText('searchable')
        ->after($after)->nullable();

    // ToDo: get indexing working on migration
    // add a fulltext index
    DB::statement(
        'ALTER TABLE ? ADD FULLTEXT fulltext_searchable (?)',
        [$table->getTable(), 'searchable']
    );

    // return our table
    return $table;
}

Итак, создается пустое длинное текстовое поле, и затем я пытаюсь создать индекс FULLTEXT из этого. Проблема, конечно, в том моменте, когда я выполняю свое утверждение, столбец с возможностью поиска на самом деле еще не существует. Можно ли как-нибудь это сделать, пока пользователь все еще так просто звонит Searchable::migrateUp() в своем файле миграции?

Цените любые указатели! Крис.

1 Ответ

0 голосов
/ 03 сентября 2018

Я думаю, что был слепым, когда придумал это - вы знаете, когда вы не можете увидеть слишком сложное решение для простого ?! Небольшое изменение мышления и рефакторинг благодаря @JonasStaudenmeir и мое решение заключается в следующем -

Мои миграции -

 /**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Searchable::migrateUp('assets', 'moderated');

}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Searchable::migrateDown('assets');
}

Мои методы -

 /**
 * Creates searchable column on model table
 *
 * @param string      $table Table name to perform migration on
 * @param string|null $after Whether to add after a particular column
 *
 * @return void
 */
public function migrateUp($table, $after = null)
{

    // add to our schema
    Schema::table(
        $table,
        function (Blueprint $table) use ($after) {
            $table->longText($this->_searchableColumnKey)
                ->after($after)->nullable();
        }
    );

    // create our index
    \DB::statement("ALTER TABLE {$table} ADD FULLTEXT fulltext_searchable ({$this->_searchableColumnKey})");
}

/**
 * Removes searchable column on table
 *
 * @param Blueprint $table Requires blueprint
 *
 * @return void
 */
public function migrateDown($table)
{
    Schema::table(
        $table,
        function (Blueprint $table) {
            $table->dropColumn($this->_searchableColumnKey);
        }
    );
}

Так что вместо того, чтобы мои методы вызывались из Schema, я просто запускаю схему изнутри методов!

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