CakePHP 3中的克隆实体和所有相关实体

v2g6jxz6  于 2022-11-11  发布在  PHP
关注(0)|答案(5)|浏览(180)

在我的CakePHP 3应用程序中,我有一个有点复杂的实体树,我需要克隆和保存。
结构的根是问卷,问卷有许多问题,每个问题有许多字段,等等(更深入)。现在我希望用户能够通过复制旧问卷来定义新问卷。然后他们可以根据需要进行更改。
我可以通过使用$questionnaire->$this->Questionnaires->get($id)和适当的 contain 字段来获得需要复制的内容的转储。有没有一种聪明的方法可以将其保存为一堆新实体,同时保留它们之间的数据和结构?

wydwbb8l

wydwbb8l1#

我认为最好的方法是遵循工作流程:
1.获取要克隆对象
1.检查集合并删除所有ID
1.转换为数组并在$this->Questionnaires->newEntity($arrayData, ['associated' => ['Questions', '...']]);中使用
1.现在,保存新实体以及要保留的所有相关数据
AFAIK没有“更聪明”的方法来克隆蛋糕3中的关联实体:-)

gpfsuwkq

gpfsuwkq2#

您也可以使用this plugin。您只需要配置行为,它就可以为您提供其他功能,比如设置默认值或向某些字段追加文本。

kcwpcxri

kcwpcxri3#

使用EntityInteface toArray()来获取它的所有字段:

$newEtity = $someTable->newEntity($oldEtity->toArray());
unset($newDevice->created);
unset($newDevice->id);
$someTable->save($newEntity);
9q78igpj

9q78igpj4#

$original = $this->Table->get($id)->toArray();
$copy = $this->Table->newEntity();
$copy = $this->Table->patchEntity($copy, $original);

unset($copy['id']);
// Unset or modify all others what you need

$this->Table->save($copy);

这样完美地工作:)

2g32fytz

2g32fytz5#

当我需要类似的东西时,我是这样做的(适用于问卷调查的例子):

// load the models
$this->loadModel('Questionnaire');
$this->loadModel('Questions');
// get the questions to questionnaire association - will need the PK name
$qAssoc = $this->{'Questions'}->associations()->get('Questionnaire');
// get the existing entity to copy
$existingEntity = $this->{'Questionnaire'}->get($id, [
    'contain' => ['Questions'],
]);
// clean up the existing entity
$existingEntity->unsetProperty($this->{'Questionnaire'}->getPrimaryKey());
$existingEntity->unsetProperty('created');
$existingEntity->unsetProperty('modified');
// clean up the associated records of the existing entity
foreach ($existingEntity->questions as &$q) {
    $q->unsetProperty($this->{'Questions'}->getPrimaryKey());
    $q->unsetProperty($qAssoc->getForeignKey());
}
// create a new entity and patch it with source data
$newEntity = $this->{'Questionnaire'}->patchEntity(
        $this->{'Questionnaire'}->newEntity(),
        $existingEntity->toArray()
);
// save the new entity
$result = $this->{'Questionnaire'}->save($existingEntity);

参考文献:

相关问题