edujugon / tablediff
比较 Laravel 数据库表的差异
Requires
- illuminate/database: ^5.1
- illuminate/support: ^5.1
Requires (Dev)
- orchestra/database: ^3.0
- orchestra/testbench: ^3.0
- phpunit/phpunit: ~4.8
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();
merge
、mergeMatched
和 mergeUnMatched
方法在接受合并之前和每次更新后都接受回调。
在回调中,完美地进行数据转换。它接收要添加的数据。
$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
方法。
这非常适合在合并后执行一些操作,如将其存储在数据库中、发送通知等。