当前位置: 首页 > 面试题库 >

每个数据库使用一个Laravel迁移表

殷耀
2023-03-14
问题内容

我在使用多个数据库的项目中工作。看来Laravel仅在设置为默认值的数据库中使用迁移表。我想要每个数据库一个迁移表,该表记录已完成到该特定数据库的迁移。这可能吗?

我已经在配置中定义了数据库,如下所示:

'connections' => [
    'db1' => array(
        'driver'    => 'mysql',
        'host'      => 'db1.host',
        'database'  => 'db1',
        'username'  => 'username',
        'password'  => 'password',
    ),
    'db2' => [
        'driver'    => 'mysql',
        'host'      => 'db2.host',
        'database'  => 'db2',
        'username'  => 'username',
        'password'  => 'password',
    ]
],

我还将第一个数据库(db1)设置为默认数据库

'default' => 'db1'

我在两个数据库上都安装了迁移表

artisan migrate:install --database=db1
artisan migrate:install --database=db2

之后,我继续创建几个数据库特定的迁移

在db1数据库中创建表test1:

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateTest1Table extends Migration
{
    public function up()
    {
        Schema::connection('db1')->create('test1', function(Blueprint $table)
        {
            $table->increments('id')->unsigned();
        });
    }

    public function down()
    {
        Schema::connection('db1')->drop('test1');
    }
}

在db2数据库中创建表test2:

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateTest2Table extends Migration
{
    public function up()
    {
        Schema::connection('db2')->create('test2', function(Blueprint $table)
        {
            $table->increments('id')->unsigned();
        });
    }

    public function down()
    {
        Schema::connection('db2')->drop('test2');
    }
}

我现在运行迁移

artisan migrate

预期结果

db1.migrations

+-----------------------------+-------+
| migration                   | batch |
+-----------------------------+-------+
| create_test1_table_in_db1   |     1 |
+-----------------------------+-------+

db2.migrations

+-----------------------------+-------+
| migration                   | batch |
+-----------------------------+-------+
| create_test2_table_in_db2   |     1 |
+-----------------------------+-------+

实际结果

db1.migrations

+-----------------------------+-------+
| migration                   | batch |
+-----------------------------+-------+
| create_test1_table_in_db1   |     1 |
| create_test2_table_in_db2   |     1 |
+-----------------------------+-------+

db2.migrations

+-----------------------------+-------+
| migration                   | batch |
+-----------------------------+-------+
Empty set

问题答案:

--database参数与migrate命令一起使用,并将每个数据库的迁移存储在单独的目录中。

您可以app/database/migrations为每个数据库(在db1和中db2)分别拥有单独的目录,并将适当的迁移存储在每个目录中。然后,您可以像这样运行迁移:

artisan migrate --database="db1" --path="app/database/migrations/db1"
artisan migrate --database="db2" --path="app/database/migrations/db2"

这样,您的migrations表将对每个数据库都是独立的。

如果您要加倍努力并实现流程自动化,则可以创建自定义命令,该命令将一次运行所有迁移。您可以创建如下命令(make:console用于Laravel
5.0到5.2或make:commandLaravel 5.2+):

artisan command:make MigrateAllCommand --command=migrate:all

这将创建一个新文件app/commands/MigrateAllCommand.php。您的命令的fire方法如下所示:

public function fire()
{
    foreach (Config::get('database.connections') as $name => $details)
    {
        $this->info('Running migration for "' . $name . '"');
        $this->call('migrate', array('--database' => $name, '--path' => 'app/database/migrations/' . $name));
    }
}

如果数据库配置键的名称与迁移目录名称相同,则此方法将起作用。然后,您可以像这样调用它:

artisan migrate:all

您可以查看Laravel命令文档以获取更多信息。



 类似资料:
  • 当尝试使用artisan迁移数据库中带有表“user”的Laravel 4时: 我收到此错误: C: \xampp\htdocs\laravel [21.04.2014 02:27:56通知]目前不允许事件报告。Reaso ns:启动前或关闭后{"错误":{"类型":"Symfony\Component\HttpKernel\Exception\NotFoundHttpExcepti on","消

  • 本文向大家介绍Laravel 内部数据库迁移,包括了Laravel 内部数据库迁移的使用技巧和注意事项,需要的朋友参考一下 示例 每个迁移都应该有一个up()方法和一个down()方法。该up()方法的目的是执行所需的操作,以将数据库模式置于新状态,并且该down()方法的目的是使该方法执行的所有操作反向up()。确保该down()方法正确撤消您的操作对于能够回滚数据库架构更改至关重要。 示例迁移

  • 使用Eloquent 仓库地址: Eloquent ORM 安装 composer require illuminate/database 注意: 有个问题就是安装了illuminate/database不能分页,需要安装illuminate/pagination; illuminate/pagination有个坑,在分页另说 添加数据库配置 修改Conf/Config.php在userConf方

  • 我有两个表,事务表和付款表,它们在过去的迁移中已经存在。当我试图在它们之间建立一个透视表时,只会得到事务外键的一个错误。“payments”表上的另一个外键创建得很好。这绝对让我感到困惑,我之前关于这个错误的讨论都没有解决这个问题。 错误(参考,MAccounting是数据库的名称): *尽管错误似乎说,payment_transaction表创建成功,以及支付表的外键;唯一中断的是交易的外键。

  • 我有一个问题与我的Laravel迁移:( 当我运行php artisan migrate时,它会在外键上停止。 首次迁移 还有第二个 运行命令后,我出现以下错误: [Illumb\Database\QueryException] SQLSTATE[HY000]:一般错误:1005无法创建表gsb_larave.35; sql-176_b9(错误号:150“外键约束格式不正确”)(sql:alter

  • 问题内容: 我正在使用Java开发数据库迁移工具。该工具将数据库表及其数据复制到目标数据库。但是我希望它可以在不同的数据库上工作。从mysql复制并在derby等中创建。使用JDBC,我们可以收集有关表及其列的足够信息。但是我要问的是,是否可以使用sql free在Java上重新创建表。我的意思是不同的数据库具有不同的数据类型,有时它们在sql语法上也有所不同。那么JDBC或任何其他库(可以是开放