野狸/laravel-duplicate

复制任何 Eloquent 模型及其底层关系

dev-master 2021-12-04 13:53 UTC

This package is auto-updated.

Last update: 2024-09-04 19:53:48 UTC


README

复制任何 Eloquent 模型及其关系

Build Status StyleCI Scrutinizer Code Quality

概述

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

可以和将有意义复制的关联类型: hasOnemorphOnehasManymorphManybelongsToManymorphToMany

安装

通过 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() 方法中指定的字段将使用其默认值(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() 方法来排除其 "子" 关系的某些列不被复制。

此方法仅接受一个参数,该参数应是一个关联数组,包含
-> 关系的名称
-> 包含要排除该关系的列的数组

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() 方法以唯一格式保存其 "子" 关系的某些列。

此方法仅接受一个参数,该参数应是一个关联数组,包含
-> 关系的名称
-> 包含该关系的唯一列的数组

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 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