edujugon/tablediff

比较 Laravel 数据库表的差异

1.0.9 2017-06-30 13:07 UTC

This package is auto-updated.

Last update: 2024-09-19 09:47:55 UTC


README

比较 Laravel 数据库表的差异。

安装

在控制台输入

composer require edujugon/tablediff

通过将 TableDiff 服务添加到 providers 数组中注册 TableDiff 服务。

'providers' => array(
        ...
        Edujugon\TableDiff\Providers\TableDiffServiceProvider::class
    )

让我们添加 Alias 门面,将其添加到 aliases 数组中。

'aliases' => array(
        ...
        'TableDiff' => Edujugon\TableDiff\Facades\TableDiff::class,
    )

使用示例

实例化主 TableDiff 类

$diff = new \Edujugon\TableDiff\TableDiff();

添加要比较的表

$diff->tables('base_table', 'merge_table');

设置枢纽

$diff->pivots('base_table_pivot', 'merge_table_pivot');

如果列具有相同的名称,可以这样做

$diff->pivot('pivot_name');

现在,我们可以运行比较并获取报告

$report = $diff->run()->withReport();

当然,所有这些方法都可以链式调用

$report = $diff->tables('base_table','merge_table')
            ->pivot('pivot_name')
            ->run()
            ->withReport();

注意,如果您不使用 column 方法,它将在两个表中寻找具有相同名称的所有列。

合并

最简单的合并方法是以下这样

$diff->tables('base_table','merge_table')
    ->pivot('id')
    ->column('column_to_update')
    ->merge();

上面的代码片段将更新 base_table 中的 column_to_update 列的值,以匹配 id 的 merge_table 中的 column_to_update 列的值。

注意,merge 方法将更新匹配的记录,并为 base 表中新的记录添加记录。

仅合并匹配的记录

diff->tables('base_table','merge_table')
    ->pivot('id')
    ->column('column_to_update')
    ->mergeMatched();

现在,让我们插入新记录。

diff->tables('base_table','merge_table')
    ->pivot('id')
    ->column('column_to_update')
    ->mergeUnMatched();

mergemergeMatchedmergeUnMatched 方法在接受合并之前和每次更新后都接受回调。

在回调中,完美地进行数据转换。它接收要添加的数据。

$ddiff->tables('base_table','merge_table')
            ->pivot('id')
            ->column('column_to_update')
            ->merge(null,function(&$data){
                // HERE your code
                $data->column_to_update = (float) $data->column_to_update;
            });

第一个回调每次数据库更新时都会被调用。它接收要更新的集合和新值的数据。

$diff->tables('base_table','merge_table')
    ->pivot('id')
    ->column('column_to_update')
    ->merge(function($collection,$data){
        //HERE your code
    });

对于 mergeUnMatched,第一个回调接收要添加的新元素,并且对每个块(默认为 10)进行调用。

$diff->tables('base_table','merge_table')
    ->pivot('id')
    ->column('column_to_update')
    ->mergeUnMatched(function($list){
        //HERE your code
    });

事件

合并完成后,包触发一个名为 Edujugon\TableDiff\Events\MergeDone 的事件,其中包含一些有用的参数。

参数

  • 合并类型
  • 报告
  • 额外负载

额外负载可以是您想添加到事件中的任何内容

$diff->eventPayload(['user' => 'John Doe']);

请注意,必须在调用 merge 方法之前调用 eventPayload 方法。

这非常适合在合并后执行一些操作,如将其存储在数据库中、发送通知等。