riesenia / cakephp-duplicatable
CakePHP ORM 插件,用于复制实体(包括相关实体)
5.1.0
2024-08-07 14:21 UTC
Requires
- cakephp/orm: ^5.0
Requires (Dev)
- cakephp/cakephp: ^5.0
- cakephp/cakephp-codesniffer: ^5.0
- phpunit/phpunit: ^10.1
README
此插件包含一个行为,用于处理复制实体及其相关数据。
安装
使用 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; }, ],