模式生成器:如果不存在则创建表格

55

我正在使用Schema Builder中的以下代码来创建表格。

Schema::create('tblCategory', function (Blueprint $table) {
    $table->increments('CategoryID');
    $table->string('Category', 40);
    $table->unique('Category', 'tblCategory_UK_Category');
    $table->timestamps();
});

问题在于,如果我需要创建一个新表,所有旧脚本都会运行,并显示错误,即表已经存在。

是否有任何使用Schema Builder创建表的方法可以避免这个问题?


你是否正在使用Laravel内置的迁移工具? - Morten
我正在使用 php artisan migrate:refresh 命令,但下一次它会尝试重新运行旧的脚本。 - Pankaj
尝试不使用 :refresh - Morten
当我运行 php artisan migrate 时,遇到了相同的问题。 - Pankaj
除了尝试创建已存在的表之外,没有错误吗?您的迁移表是否填充了它尝试运行的文件名?如果您在新数据库上尝试它,是否会成功而不出现任何错误,并因此将成功迁移的文件填充到迁移表中? - Morten
显示剩余2条评论
3个回答

105

如果不存在则尝试创建表格,请尝试以下代码:

use Illuminate\Support\Facades\Schema;

if (!Schema::hasTable('tblCategory')) {
     Schema::create('tblCategory', function($table){
            $table->engine = 'InnoDB';
            $table->increments('CategoryID');
            $table->string('Category', 40);
            $table->unique('Category', 'tblCategory_UK_Category');
            $table->timestamps();
    });
}

11
在添加表之前,您也可以使用 if (Schema::hasTable('tblCategory')) { return; } 进行判断。该语句的作用是检查数据库中是否已经存在名为 'tblCategory' 的表,如果存在则直接返回,不再执行后续的添加操作。 - Sean the Bean
1
你好,这行代码的意思是:如果表'tblCategory'不存在,则创建'tblCategory'表。最后一句话是在询问该表是否存在。 - Software Developer

6

请在此处检查答案

要创建新表,只需使用 Laravel Schema 函数 hasTable 进行一次检查。

但是,如果您想在检查其存在性之前删除任何表,则可以使用名为 dropIfExists 的 Schema 函数。

Schema::dropIfExists('table_name');

它会删除表,如果表存在的话。

1
使用时要小心,它会删除您现有的表和数据。 - Imran Zahoor

1
DB::transaction(function () {
        // Create your table here with schema builder.
});

如果事务闭包中抛出异常,事务将自动回滚。因此,尝试创建已存在的表会引发错误。在Laravel中,大多数数据库事务都应该有这个闭包。

https://laravel.com/docs/5.6/database


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接