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

克隆实体和CakePHP 3中的所有相关实体,php,cakephp,cakephp-3.0,Php,Cakephp,Cakephp 3.0,在我的CakePHP 3应用程序中,我有一个需要克隆和保存的复杂实体树 该结构的根源是一份问卷,一份问卷有很多问题,每个问题都有很多领域,等等(它更深入)。现在,我希望用户能够通过复制旧问卷来定义新问卷。然后他们可以改变任何他们需要的 我可以使用$inventory->$this->inventures->get($id)和适当的包含字段来获取需要复制的内容的转储。是否有一种聪明的方法将其保存为一组新实体,同时保留它们之间的数据和结构?我认为最好的方法是遵循工作流程: 获取要克隆的对象 检查集合

在我的CakePHP 3应用程序中,我有一个需要克隆和保存的复杂实体树

该结构的根源是一份问卷,一份问卷有很多问题,每个问题都有很多领域,等等(它更深入)。现在,我希望用户能够通过复制旧问卷来定义新问卷。然后他们可以改变任何他们需要的


我可以使用
$inventory->$this->inventures->get($id)
和适当的包含字段来获取需要复制的内容的转储。是否有一种聪明的方法将其保存为一组新实体,同时保留它们之间的数据和结构?

我认为最好的方法是遵循工作流程:

  • 获取要克隆的对象
  • 检查集合并删除所有ID
  • 转换为数组,并在
    $this->investments->newEntity($arrayData,['associations'=>['Questions','…]]中使用它
  • 现在保存新实体以及所有要保留的相关数据

  • 好了,在Cake 3:-)中没有“更聪明”的方法克隆具有关联的实体。

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

    以下是我在需要类似内容时的操作方法(适用于问卷示例):

    参考资料:

    使用EntityInterface toArray()获取其所有字段:

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

    工作原理如下:)

    这里转换为数组并返回实体有什么意义?假设要克隆的对象已经是一个实体,此双重转换的结果会有任何有用的不同吗?因为您需要它作为
    newEntity()
    ()中的数组数据,所以值得尝试克隆实体,删除ID,然后尝试在
    save()中使用它
    -我不确定这是否会将其保存为一个新实体,但它实际上可以做到这一点。。()是的,我认为如果您删除所有ID并调用
    isNew(true)
    ,您将得到与转换为数组并返回相同的结果。在构建一个递归和通用(基于模型的关联)的函数的过程中,它还没有被完全测试。啊哈!我甚至不确定除了删除ID之外还有什么必要。。。
    $newEtity = $someTable->newEntity($oldEtity->toArray());
    unset($newDevice->created);
    unset($newDevice->id);
    $someTable->save($newEntity);
    
    $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);