Миграция Laravel: Как проверить существует ли таблица или столбец
Доброго времени суток. В одном проекте на Laravel столкнулся c проблемой. Точнее даже не с проблемой, а неприятностью. Необходимо расширить функционал приложения. И вот я приступил. Создал миграцию, которая создавала таблицу, например, messages. Запустил миграцию. И… Ошибка! Такая таблица уже была. Да, я не заметил. Было порядка 50 миграций и порядка 35-40 таблиц. И это я один разработчик. И я представил, какой это кошмар, когда проект большой: несколько сотен таблиц, еще больше миграций и над проектом трудятся с десяток программистов. Поэтому и решил написать эту статью: «Как проверить существования таблицы или столбца в миграции»
Давайте создадим миграцию. Для этого используем artisan команду:
php artisan make:migration create_messages_table --create=messages
Тут мы использовали параметр –create, который указывает, что мы создаем таблицу и дальше пишем название таблицы.
И вот метод up()
Schema::create('messages', function (Blueprint $table) { $table->increments('id'); $table->string('title'); $table->text('amessage'); $table->timestamps(); });
И если таблица сообщений уже существует, то миграция не выполнится. Давайте сделаем проверку на существование таблицы messages. Для этого изменим метод up():
public function up() { if (!Schema::hasTable('messages')) { Schema::create('messages', function (Blueprint $table) { $table->increments('id'); $table->string('title'); $table->text('message'); $table->timestamps(); }); } }
Тут мы использовали статический метод hasTable в качестве параметра передаем название таблицы. Данный метод проверят существует ли указанная таблица. И если да, то вернет истину, если нет – ложь.
Для того, чтобы проверить существует ли в таблице столбец используется статический метод Scheme::hasColumn(<название таблицы>, <название колонки>). В качестве параметров передаются: название таблицы, в которой ищем колонку и название колонки.
И тогда эти методы мы можем использовать следующим образом:
public function up() { if (Schema::hasTable ('messages')) { Schema::table('messages', function (Blueprint $table) { if (!Schema::hasColumn('messages', 'user_id')) { $table->unsignedInteger('user_id'); } }); } }
Первое, мы проверили, что таблица messages существует. Затем перешли в таблицу messages для того, чтобы создать новую колонку user_id. Но перед тем, как создавать колонку мы проверили, что она не существует.
Вот и все. Миграции работают. Все довольны.
Заключение.
Мы с вами рассмотрели два метода:
- Schema::hasTable(), который служит для проверки существования таблицы
- Schema::hasColumn(), который служит для проверки существования колонки в таблице.