khaleejinfotech/laravel-db-sync

同步远程数据库到本地数据库或反之亦然

v1.0.5 2023-01-04 12:47 UTC

This package is auto-updated.

Last update: 2024-09-04 16:29:41 UTC


README

Laravel DB Sync

简介

同步远程数据库到本地数据库或反之亦然

注意 这需要远程MySQL连接来同步数据库,并且需要在database.php中定义

安装

安装此包。
注意:此扩展在Laravel 8及以上版本中工作。

composer require khaleejinfotech/laravel-db-sync

配置

您可以使用以下命令发布配置文件

php artisan vendor:publish --provider="Khaleejinfotech\LaravelDbSync\LaravelDbSyncServiceProvider" --tag="laravel-db-sync"

数据库连接

在您的 config/database.php 文件中设置远程数据库凭据

'connections' => [
    ...
    
    'mysql_remote' => [
        'driver' => 'mysql',
        'url' => env('DATABASE_URL'),
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'unix_socket' => env('DB_SOCKET', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'prefix_indexes' => true,
        'strict' => true,
        'engine' => null,
        'options' => extension_loaded('pdo_mysql') ? array_filter([
            PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
        ]) : [],
    ],
    
    ...
],

观察记录

要观察记录的变化并与远程/本地数据库同步,必须在模型上使用 use Syncable,默认情况下,此包使用其自己的观察者,但您可以替换为具有相同代码的观察者以及您自己的自定义逻辑。

您可以从 config/laravel-db-sync.php 文件中替换观察者类。

...
'observer_class' => \Khaleejinfotech\LaravelDbSync\Observers\ModelObserver::class,
...

注意:观察者方法仅在Eloquent模型上触发。

忽略模型

您还可以创建一个使用 use Syncable 的基模型,并扩展您的子模型,在这种情况下,如果您想忽略某些模型,您可以在 config/laravel-db-sync.php 文件中指定,如下所示

...
'ignore_models' => [
    // Models to be ignored if sync booted in base model.
    User::class,
],
...

定义目标/远程服务器。

config/database.php 文件中设置连接后,您必须添加需要同步数据的数据同步连接名称。

'targets' => [
    // database connection names
    'mysql_remote',
],

注意:请在此处仅指定远程连接,否则可能会导致数据重复或出现错误。

处理模型的上传文件

如果一个模型处理文件,那么在配置文件中应定义模型的列,以便文件可以同步到本地/远程服务器。

...
    /*\App\Models\Model::class => [
        [
            'column_name' => 'photo',
            'remote_disks' => [
                // remote disks locations from filesystem config file.
                'ftp'
            ],
            'local_disk' => 'public',
            'upload_path_local' => 'folder',
            'upload_path_remote' => 'folder',
        ]
    ],*/
...

事件

命令

用法

通过运行以下命令将本地数据库同步到远程

这将为每个需要同步的记录创建一个作业。

php artisan sync:local

之后,您需要运行队列

php artisan queue:work

通过运行以下命令将远程数据库同步到本地

这将为每个需要同步的记录创建一个作业。

php artisan sync:remote

之后,您需要运行队列

php artisan queue:work

建议: 配置调度器以自动化同步命令。