riesenia/cakephp-duplicatable

CakePHP ORM 插件,用于复制实体(包括相关实体)

安装数: 281,765

依赖项: 4

建议者: 0

安全性: 0

星标: 50

关注者: 9

分支: 20

开放性问题: 5

类型:cakephp-plugin

5.1.0 2024-08-07 14:21 UTC

README

CI Coverage Status Latest Version Total Downloads Software License

此插件包含一个行为,用于处理复制实体及其相关数据。

安装

使用 composer

composer require riesenia/cakephp-duplicatable

使用以下命令加载插件

bin/cake plugin load Duplicatable

用法

此行为为您的 Table 对象提供了多种方法。

方法 duplicate

此行为为表提供 duplicate 方法。它将复制的记录的主键作为其唯一参数。使用此方法将克隆由提供的主键定义的记录以及配置中定义的所有相关记录。

方法 duplicateEntity

此行为为表提供 duplicateEntity 方法。它主要作为 duplicate 方法,除了它不保存复制的记录,而是返回要保存的实体。如果您需要在保存之前操作实体,这很有用。

配置选项

  • finder - 用于获取实体的查找器。将其设置为 "translations" 以获取并复制翻译。默认为 "all"。可以设置一个数组以使用更多查找器。
  • contain - 设置要复制的相关实体
  • remove - 要从实体中删除的字段
  • set - 要设置以提供值或可调用的字段。如果您提供可调用,它将实体副本作为唯一参数
  • prepend - 要将提供的文本添加到值前缀的字段
  • append - 要将提供的文本添加到值后缀的字段
  • saveOptions - 主表上的保存选项
  • preserveJoinData - 如果 BelongsToMany 关系中的 _joinData 属性应保留 - 默认为 false,因为此关联性质复杂

示例

class InvoicesTable extends Table
{
    public function initialize(array $config): void
    {
        parent::initialize($config);

        // add Duplicatable behavior
        $this->addBehavior('Duplicatable.Duplicatable', [
            // table finder
            'finder' => 'all',
            // duplicate also items and their properties
            'contain' => ['InvoiceItems.InvoiceItemProperties'],
            // remove created field from both invoice and items
            'remove' => ['created', 'invoice_items.created'],
            // mark invoice as copied
            'set' => [
                'name' => function($entity) {
                    return md5($entity->name) . ' ' . $entity->name;
                },
                'copied' => true
            ],
            // prepend properties name
            'prepend' => ['invoice_items.invoice_items_properties.name' => 'NEW '],
            // append copy to the name
            'append' => ['name' => ' - copy']
        ]);

        // associations (InvoiceItems table hasMany InvoiceItemProperties)
        $this->hasMany('InvoiceItems', [
            'foreignKey' => 'invoice_id',
            'className' => 'InvoiceItems'
        ]);
    }
}

// ... somewhere in the controller
$this->Invoices->duplicate(4);

有时您需要访问原始实体,例如设置祖先/父引用 ID。在这种情况下,您可以通过作为第二个参数传递的 $original 实体来利用它。

'set' => [
    'ancestor_id' => function ($entity, $original) {
        return $original->id;
    },
],