野狸 / laravel-duplicate
复制任何 Eloquent 模型及其底层关系
Requires
- php: ^7.2.5|^8.0|^8.1
- illuminate/contracts: ^7.0|^8.0
- illuminate/database: ^7.0|^8.0
- illuminate/support: ^7.0|^8.0
Requires (Dev)
- orchestra/testbench: ^5.0
- phpunit/phpunit: ^9
This package is auto-updated.
Last update: 2024-09-04 19:53:48 UTC
README
复制任何 Eloquent 模型及其关系
概述
此包允许您复制任何 Eloquent 模型记录及其底层关系。
可以和将有意义复制的关联类型: hasOne
、morphOne
、hasMany
、morphMany
、belongsToMany
、morphToMany
安装
通过 Composer 安装此包
composer require vildanbina/laravel-duplicate
使用
步骤 1
您的 Eloquent 模型应使用 vildanbina\Duplicate\Traits\HasDuplicates
特性和 vildanbina\Duplicate\Options\DuplicateOptions
类。
该特性包含一个抽象方法 getDuplicateOptions()
,您必须自行实现。
以下是如何实现特性的示例
<?php namespace App; use Illuminate\Database\Eloquent\Model; use vildanbina\Duplicate\Options\DuplicateOptions; use vildanbina\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 模型中使用了 vildanbina\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()
方法来排除其 "子" 关系的某些列不被复制。
此方法仅接受一个参数,该参数应是一个关联数组,包含
键 -> 关系的名称
值 -> 包含要排除该关系的列的数组
在 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()
方法以唯一格式保存其 "子" 关系的某些列。
此方法仅接受一个参数,该参数应是一个关联数组,包含
键 -> 关系的名称
值 -> 包含该关系的唯一列的数组
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 vildanbina\Duplicate\Options\DuplicateOptions; use vildanbina\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(); } }
鸣谢
安全
如果您发现任何与安全相关的问题,请通过电子邮件 vildanbina@gmail.com 联系,而不是使用问题跟踪器。
许可
MIT 许可证 (MIT)。有关更多信息,请参阅 LICENSE。
更新日志
有关最近更改的更多信息,请参阅 CHANGELOG。
贡献
有关详细信息,请参阅 CONTRIBUTING。