bfg/eloquent-duplicate

复制任何Eloquent模型及其关联关系

6.0.0 2022-11-02 08:31 UTC

This package is auto-updated.

Last update: 2024-08-30 01:23:43 UTC


README

这是从Bfg/eloquent-duplicate分叉而来,使其与新的Laravel 8.x|9.x兼容

复制任何Eloquent模型及其关联关系

概述

此包允许您复制任何Eloquent模型记录及其底层关系。

可以并应复制的关联类型:hasOnemorphOnehasManymorphManybelongsToManymorphToMany

安装

通过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()方法中指定的字段将保存其默认值(nullfalse0等)。

/**
 * 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()方法中指定的字段将保存其默认值(nullfalse0等)。

/**
 * 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事件:duplicatingduplicated

您可以将这些事件实现到您的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以获取详细信息。