bfg / eloquent-duplicate
复制任何Eloquent模型及其关联关系
Requires
- php: ^7.4|^8.0|^8.1
- illuminate/contracts: ^8.0 || ^9.0
- illuminate/database: ^8.0 || ^9.0
- illuminate/support: ^8.0 || ^9.0
Requires (Dev)
- orchestra/testbench: ^6.4
- phpunit/phpunit: ^9.3
README
这是从Bfg/eloquent-duplicate分叉而来,使其与新的Laravel 8.x|9.x兼容
复制任何Eloquent模型及其关联关系
概述
此包允许您复制任何Eloquent模型记录及其底层关系。
可以并应复制的关联类型:hasOne
、morphOne
、hasMany
、morphMany
、belongsToMany
、morphToMany
安装
通过Composer安装此包
composer require bfg/eloquent-duplicate
使用
步骤1
您的Eloquent模型应使用Bfg\Duplicate\Traits\HasDuplicates
特性和Bfg\Duplicate\Options\DuplicateOptions
类。
该特性包含一个抽象方法getDuplicateOptions()
,您必须自己实现。
以下是如何实现该特性的示例
<?php namespace App; use Illuminate\Database\Eloquent\Model; use Bfg\Duplicate\Options\DuplicateOptions; use Bfg\Duplicate\Traits\HasDuplicates; class YourModel extends Model { use HasDuplicates; /** * Get the options for duplicating the model. * * @return DuplicateOptions */ public function getDuplicateOptions(): DuplicateOptions { return DuplicateOptions::instance(); } }
步骤2
一旦在Eloquent模型中使用了Bfg\Duplicate\Traits\HasDuplicates
特性,您就可以通过该特性上存在的saveAsDuplicate()
方法来复制模型记录。
$model = YourModel::find($id); $duplicatedModel = $model->saveAsDuplicate(); // returns the newly duplicated model instance
定制
排除某些列
在复制模型时,您可以通过在getDuplicateOptions()
方法的定义中使用excludeColumns()
方法来排除某些列不被复制。
excludeColumns()
方法中指定的字段将保存其默认值(null
、false
、0
等)。
/** * Get the options for duplicating the model. * * @return DuplicateOptions */ public function getDuplicateOptions() : DuplicateOptions { return DuplicateOptions::instance() ->excludeColumns('column_one', 'column_two'); }
指定唯一列
在复制模型时,您可以通过在getDuplicateOptions()
方法的定义中使用uniqueColumns()
方法以唯一格式保存某些列。
uniqueColumns()
方法中指定的字段将通过在末尾附加(n)
来保存。例如:原始名称(1)、原始名称(2)
/** * Get the options for duplicating the model. * * @return DuplicateOptions */ public function getDuplicateOptions() : DuplicateOptions { return DuplicateOptions::instance() ->uniqueColumns('column_one', 'column_two'); }
排除整个关联
默认情况下,在复制模型时,所有其“子”关联(见概述)也会与其一起复制。
您可以通过在getDuplicateOptions()
方法的定义中使用excludeRelations()
方法来排除某些关联不被复制。
excludeRelations()
方法中指定的关联将不会与目标模型一起复制,这意味着新复制的模型将不会与指定的关联有任何记录相关联。
/** * Get the options for duplicating the model. * * @return DuplicateOptions */ public function getDuplicateOptions() : DuplicateOptions { return DuplicateOptions::instance() ->excludeRelations('relationOne', 'relationTwo'); }
排除某些关系的某些列
在复制模型时,您可以通过在getDuplicateOptions()
方法的定义中使用excludeRelationColumns()
方法来排除其“子”关系的某些列不被复制。
此方法仅接受一个参数,应该是一个包含以下内容的关联数组:key -> 关联名称 value -> 要排除该关联的列的数组
excludeRelationColumns()
方法中指定的字段将保存其默认值(null
、false
、0
等)。
/** * Get the options for duplicating the model. * * @return DuplicateOptions */ public function getDuplicateOptions() : DuplicateOptions { return DuplicateOptions::instance() ->excludeRelationColumns([ 'relationOne' => ['column_one', 'column_two'], 'relationTwo' => ['column_one'], ]); }
为某些关系指定唯一列
在复制模型时,您可以通过在getDuplicateOptions()
方法的定义中使用uniqueRelationColumns()
方法以唯一格式保存其“子”关系的某些列。
此方法仅接受一个参数,应该是一个包含以下内容的关联数组:key -> 关联名称 value -> 该关系的唯一列数组
在uniqueRelationColumns()
方法中指定的字段将以唯一格式保存,即在末尾添加(n)
。例如:原始关系名称 (1),原始关系名称 (2)
/** * Get the options for duplicating the model. * * @return DuplicateOptions */ public function getDuplicateOptions() : DuplicateOptions { return DuplicateOptions::instance() ->uniqueRelationColumns([ 'relationOne' => ['column_one', 'column_two'], 'relationTwo' => ['column_one'], ]); }
仅复制目标模型
如果您只想复制目标模型而完全不复制任何关系,您可以在getDuplicateOptions()
方法的定义中使用disableDeepDuplication()
方法来指定此操作。
使用此方法时,复制模型时将忽略所有类型的所有关系。
/** * Get the options for duplicating the model. * * @return DuplicateOptions */ public function getDuplicateOptions() : DuplicateOptions { return DuplicateOptions::instance() ->disableDeepDuplication(); }
事件
复制功能包含两个Eloquent事件:duplicating
和duplicated
您可以将这些事件实现到您的Eloquent模型中,就像实现Laravel框架中包含的任何其他Eloquent事件一样。
<?php namespace App; use Illuminate\Database\Eloquent\Model; use Bfg\Duplicate\Options\DuplicateOptions; use Bfg\Duplicate\Traits\HasDuplicates; class YourModel extends Model { use HasDuplicates; /** * Boot the model. * * @return DuplicateOptions */ public static function boot() { parent::boot(); static::duplicating(function ($model) { // your logic here }); static::duplicated(function ($model) { // your logic here }); } /** * Get the options for duplicating the model. * * @return DuplicateOptions */ public function getDuplicateOptions(): DuplicateOptions { return DuplicateOptions::instance(); } }
致谢
安全
如果您发现任何与安全相关的问题,请通过电子邮件bfg.script@gmail.com联系,而不是使用问题跟踪器。
许可协议
MIT许可协议(MIT)。有关更多信息,请参阅LICENSE。
更新日志
请参阅CHANGELOG以了解最近的变化。
贡献
请参阅CONTRIBUTING以获取详细信息。