proai/laravel-super-migrations

这个Laravel包适用于大型数据库,以获得更好的迁移结构。

1.0.13 2024-08-26 19:25 UTC

This package is not auto-updated.

Last update: 2024-09-23 19:56:23 UTC


README

Latest Stable Version Total Downloads Latest Unstable Version License

这是一个Laravel迁移的扩展。当您有一个大型数据库并产生大量迁移文件时,它非常有用。这个包将帮助您减少迁移文件的数量,并且它还会给您一个更好的结构,您将可以在一个文件中拥有一个表的全部模式更新。

安装

您可以通过composer安装此包

composer require proai/laravel-super-migrations

用法

基本上,我们不通过迁移定义表构建器模式,而是通过表。为此,您需要在database/migrations目录中创建一个tables文件夹。对于每个表,我们将在新目录中创建一个文件,并在需要的地方将这些文件链接到迁移文件中。以下是更详细的说明

迁移类

首先,这是在database/migrations文件夹中的一个迁移文件。请注意,我们扩展了ProAI\SuperMigrations\Migration类。与up()down()方法不同,这个类需要一个schemas()方法

<?php

use ProAI\SuperMigrations\Migration;

class InitProject extends Migration
{
    /**
     * Get table names and related methods for up and down schemas.
     *
     * @return array
     */
    public function schemas()
    {
        return [
            'users' => 'create',
            'comments' => 'create'
        ];
    }
}

schemas()方法返回受此迁移影响的全部数据库表列表(例如上面的userscomments表)。由于一个数据库表可能有多个迁移,因此我们还需要为每个表分配一个特定的迁移名称(例如,对于userscomments表,名称为create)。

使用这种模式,我们可以轻松地将模式捆绑到一个迁移文件中。另一个例子:假设我们想要添加一个角色表并在用户表中添加一个role_id列,那么schemas()方法可能如下所示

return [
    'roles' => 'create',
    'users' => 'addRoleIdColumn'
];

这个想法是,一个迁移文件包含整个更新步骤的所有模式,而不是只针对一个表(即一个迁移InitProject与多个迁移CreateUsersTableCreateCommentsTable等)。这样,您将拥有更少的迁移文件。

表类

对于schemas()方法返回的每个表名,Laravel Super Migrations将在database/migrations/tables中搜索具有相同名称的PHP文件(例如,对于表users,必须存在一个文件users.php)。该文件必须包含一个扩展ProAI\SuperMigrations\Table的类,并以表名(驼峰式)加Table后缀命名。例如,对于表users,类名必须是UsersTable

此外,对于我们在迁移文件中声明的每个特定的迁移名称,表类必须声明一个具有相同名称的方法(例如,用户表的create方法)。以下是一个与上一节迁移类相匹配的示例用户表类

<?php

use Illuminate\Database\Schema\Blueprint;
use ProAI\SuperMigrations\Table;
use Illuminate\Support\Facades\DB;

class UserTable extends Table
{
    /**
     * Create the table.
     *
     * @return void
     */
    public function create()
    {
        // These statements will be only executed if direction of migrations is up
        $this->upSchema()->create(function (Blueprint $table) {
            $table->increments('id');
            $table->timestamps();
        });

        $this->up(function($tableName) {
            DB::raw('ALTER TABLE `'.$tableName.'` ADD `client_id` BINARY(16)');
        });


        // These statements will be only executed if direction of migrations is down
        $this->downSchema()->dropIfExists();

        $this->down(function($tableName) {
            // some code
        });
    }
}

我们使用$this->upSchema()$this->downSchema()来定义上和下模式。这些方法返回一个类似于Laravel数据库模式构建器的ProAI\SuperMigrations\Builder实例(请参阅Laravel文档)。唯一的区别是您不需要将表名作为第一个参数,因为表名已经已知。此外,我们使用$this->up(...)$this->down(...)来插入自定义代码,如原始DB语句(通常我们不需要这些方法)。

生成器命令

运行 php artisan make:super-migration 来创建一个符合此包模式的新的迁移类。您可以使用 --path 选项声明自定义路径。请注意,您必须包含服务提供者才能使用此命令(请参阅安装部分)。

支持

错误和功能请求在 GitHub 上跟踪。

许可证

此包是在 MIT 许可证 下发布的。