Проверьте, существует ли столбец в файле миграции Laravel

У меня уже есть имя таблицы table_one.. Теперь я хочу добавить к ней еще два столбца. Пока все работает нормально. Но в моем методе я хочу проверить, существует ли столбец в моей таблице, например dropIfExists('table')..

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::table('table_one', function (Blueprint $table) {
        $table->string('column_one')->nullable();
        $table->string('column_two')->nullable();
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::table('table_one', function (Blueprint $table) {
        // in here i want to check column_one and column_two exists or not
        $table->dropColumn('column_one');
        $table->dropColumn('column_two');
    });
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
40
0
40 961
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Вам нужно что-то вроде этого

  public function down()
    {
        if (Schema::hasColumn('users', 'phone'))
        {
            Schema::table('users', function (Blueprint $table)
            {
                $table->dropColumn('phone');
            });
        }
    }

Спасибо. Ваше решение сработало нормально. Но мне такой подход не понравился. Я хотел что-то вроде dropIfExists ('column').

Md.Sukel Ali 14.01.2019 08:22

Просто разбейте схему на два вызова

public function up()
{
    Schema::table('table_one', function (Blueprint $table) {
        $table->dropColumn(['column_one', 'column_two']);
    });

    Schema::table('table_one', function (Blueprint $table) {
        $table->string('column_one')->nullable();
        $table->string('column_two')->nullable();
    });
}

Это приведет к удалению и всех данных в этих столбцах! Очень опасный код!

Moe 25.07.2020 08:17

Вы можете создать свою собственную функцию dropColumnIfExists (), которая проверяет наличие столбца, а затем отбросить ее:

function myDropColumnIfExists($myTable, $column)
{
    if (Schema::hasColumn($myTable, $column)) //check the column
    {
        Schema::table($myTable, function (Blueprint $table)
        {
            $table->dropColumn($column); //drop it
        });
    }

}

И используйте его для функции down () следующим образом:

public function down()
{
    myDropColumnIfExists('table_one', 'column_two');
    myDropColumnIfExists('table_one', 'column_one');
}

Пожалуйста, всегда предоставляйте некоторые пояснения, а не просто фрагмент кода.

pouria 25.03.2021 18:07

Если вы действительно хотите, чтобы это было внутри закрытия Schema::table, что является единственным изящным способом сделать это ... вам нужно либо добавить пару методов в Blueprint, либо использовать этот шаблон при каждой миграции ... это не красиво, но как только он появится, вы можете определить столько условных добавлений и отбрасываний, сколько захотите, используя только 1 строку в каждой.

return new class extends Migration {
    public function up() {

        Schema::table('tblAnimal', function (Blueprint $table) {
            $exists = function (string $column) use ($table) {
                return (Schema::hasColumn($table->getTable(), $column));
            };
            $addUnlessExists = function (string $type, string $name, array $parameters = [])
                use ($table, $exists) {
                    return $exists($name) ? null : $table->addColumn($type, $name, $parameters);
                };
            $dropIfExists = function (string $column) use ($table, $exists) {
                return $exists($column) ? $table->dropColumn($column) : null;
            };

            $dropIfExists('column_name');
            $addUnlessExists('integer', 'int_column');
            # ...
        });

Другие вопросы по теме