vdlp/eloquent-model-cloner

克隆eloquent模型及其关系

1.1.0 2021-06-17 15:53 UTC

This package is auto-updated.

Last update: 2024-09-17 23:30:22 UTC


README

此包受https://github.com/BKWLD/cloner 启发,并修改为也可以与OctoberCMS安装一起使用。

一个Laravel Eloquent模型特性,允许您克隆一个模型及其关系,包括文件。甚至可以克隆到另一个数据库。

安装

要开始使用Eloquent Model Cloner,请使用Composer将包添加到项目的依赖中

composer require vdlp/eloquent-model-cloner

用法

您的模型现在应该看起来像这样

class Article extends Eloquent {
   use \Vdlp\EloquentModelCloner\Cloneable;
}

您可以像这样克隆一个Article模型

$clone = Article::first()->duplicate();

克隆关系

假设您的Article拥有多个Photos(一对一关系)和多个Authors(多对多关系)。现在,您的Article模型应该看起来像这样

class Article extends Eloquent {
   use \Vdlp\EloquentModelCloner\Cloneable;

   protected $cloneableRelations = ['photos', 'authors'];

   public function photos() {
       return $this->hasMany('Photo');
   }

   public function authors() {
        return $this->belongsToMany('Author');
   }
}

$cloneableRelations 通知 Cloneable 在克隆时应跟随哪些关系。现在当您调用 Article::first()->duplicate() 时,原始的所有 Photo 行将被复制并关联到新的 Article。还会创建新的中继行,将新的 Article 与原始的 Authors 关联(因为它是多对多关系,不会创建新的 Author 行)。此外,如果 Photo 模型与某些其他模型有多对多关系,您可以在其类中指定 $cloneableRelations,并且 Cloner 也会继续复制它们。

自定义克隆属性

默认情况下,Cloner 不复制 id(或您已定义的模型 key)字段;它假设将自动递增新值。它也不复制 created_atupdated_at。您可以添加以下内容来忽略更多属性

class Photo extends Eloquent {
   use \Vdlp\EloquentModelCloner\Cloneable;

   protected $cloneExemptAttributes = ['uid', 'source'];

   public function article() {
        return $this->belongsTo('Article');
   }

   public function onCloning($src, $child = null) {
        $this->uid = str_random();

        if ($child) {
            echo 'This was cloned as a relation!';
        }

        echo 'The original key is: ' . $src->getKey();
   }
}

$cloneExemptAttributes 添加到默认值。如果您想完全替换默认值,则覆盖特质的 getCloneExemptAttributes() 方法并返回一个数组。

此外,请注意示例中的 onCloning() 方法。它被用来确保唯一列保持唯一。Cloneable 特质添加了在复制期间模型保存前立即调用以及保存后立即调用的无操作回调:onCloning()onCloned()$child 参数允许您根据它是否作为关系或直接克隆来定制行为。

此外,Cloner 在克隆期间以及模型被克隆时触发事件,请参阅

  • \Vdlp\EloquentModelCloner\Events\Cloned
  • \Vdlp\EloquentModelCloner\Events\Cloning

事件负载包含克隆和原始模型实例。