复制模型及其关联
Duplicate model along with it's associations
我发现 this post 给出了如何执行此操作的答案,但它对我来说不太适用。
我有一个名为 SitePage
的模型,它有许多 SitePageGroup
,而后者又有许多 SitePageContent
// SitePage Model
public $hasMany = array(
'SitePageGroup' => array(
'className' => 'FoCMS.SitePageGroup',
'foreignKey' => 'site_page_id',
'dependent' => FALSE,
),
);
// SitePageGroup Model
public $belongsTo = array(
'SitePage' => array(
'className' => 'FoCMS.SitePage',
'foreignKey' => 'site_page_id',
),
);
public $hasMany = array(
'SitePageContent' => array(
'className' => 'FoCMS.SitePageContent',
'foreignKey' => 'site_page_group_id',
'dependent' => FALSE,
),
);
// SitePageContent Model
public $belongsTo = array(
'SitePageGroup' => array(
'className' => 'FoCMS.SitePageGroup',
'foreignKey' => 'site_page_group_id',
),
);
使用该链接问题中的答案,我看到父模型 SitePage
被复制,但相关模型正在从原始模型中删除并与新模型相关联。
$record = $this->SitePage->find('first', array('condition' => array('SitePage.id' => $id)));
unset($record['SitePage']['id'], $record['SitePageGroup']['id'], $record['SitePageGroup']['SitePageContent']['id'] /* further ids */);
$this->SitePage->create();
$record['SitePage']['name'] = $record['SitePage']['name'].'-copy';
$record['SitePage']['friendly_name'] = $record['SitePage']['friendly_name'].' Copy';
if($this->SitePage->saveAll($record)){
$this->Session->setFlash('The site page has been saved', 'fo_message');
$this->redirect(array('action' => 'index'));
}else{
$this->Session->setFlash('The site page could not be saved. Please, try again.', 'fo_message');
}
更新
调试我试图重置的记录我看到以下内容
array(
'SitePage' => array(
'name' => 'test',
'friendly_name' => 'Test',
'order' => '82',
'created' => '2015-09-03 19:16:40',
'modified' => '2015-09-03 19:20:27'
),
'SitePageGroup' => array(
(int) 0 => array(
'id' => '55e88087-a4dc-4c37-89dc-f9c172b40463',
'site_page_id' => '55e88078-16c8-46ce-bf02-fa5372b40463',
'name' => 'group-1',
'friendly_name' => 'Group 1',
'order' => '1',
'created' => '2015-09-03 19:16:55',
'modified' => '2015-09-03 19:16:55'
),
(int) 1 => array(
'id' => '55e8809e-d018-4ebe-a4cf-fbef72b40463',
'site_page_id' => '55e88078-16c8-46ce-bf02-fa5372b40463',
'name' => 'group-2',
'friendly_name' => 'Group 2',
'order' => '2',
'created' => '2015-09-03 19:17:18',
'modified' => '2015-09-03 19:17:18'
)
)
)
我得到这个结果的方法是这样做
$sitePage = $this->SitePage->find('first', array(
'conditions' => array(
'SitePage.id' => $id,
),
));
unset($sitePage['SitePage']['id'], $sitePage['SitePageGroup']['id'], $sitePage['SitePageGroup']['SitePageContent']['id'], $sitePage['SitePageGroup']['site_page_id'], $sitePage['SitePageGroup']['SitePageContent']['site_page_group_id'] /* further ids */);
debug($sitePage);
die();
但也正如您在调试输出中看到的那样,未包括关联模型的第 3 级,每个 SitePageGroup
还应该有一个 SitePageContent
我认为对 SitePageGroup
数组的简单循环应该重置 id 并将外键设置为 null,但我想我还需要以某种方式包含属于 SitePageContent
SitePageGroup
这样我也可以重置它们。
您需要确保所有的主键和外键在保存前都设置为null
。您似乎只是在重置模型的主键,但 Cake 需要知道需要生成外键,以便它们引用新记录。
在调用 $record
之前,可能值得使用 debug($record);
检查该数组中的所有内容是否已 set/reset 适当地确保副本将按预期工作。
更新
根据您在更新后的问题中发布的数组内容,您似乎没有从保存数据中删除所有主键和外键。您需要确保从您要保存的所有内容中删除这些内容,包括具有许多关联的内容。
如果您查看您的数组,您应该能够看到 unset($sitePage['SitePageGroup']['id'])
不会删除您的 SitePageGroup
数据的主要 ID,因为您正在取消设置的内容与中的数组路径不对应你的 $sitePage
数组。
您可以像这样使用 CakePHP 的 Hash utility to remove 数组中的主键:-
$sitePage = Hash::remove($sitePage, 'SitePageGroup.{n}.id');
外键也类似:-
$sitePage = Hash::remove($sitePage, 'SitePageGroup.{n}.site_page_id');
我发现 this post 给出了如何执行此操作的答案,但它对我来说不太适用。
我有一个名为 SitePage
的模型,它有许多 SitePageGroup
,而后者又有许多 SitePageContent
// SitePage Model
public $hasMany = array(
'SitePageGroup' => array(
'className' => 'FoCMS.SitePageGroup',
'foreignKey' => 'site_page_id',
'dependent' => FALSE,
),
);
// SitePageGroup Model
public $belongsTo = array(
'SitePage' => array(
'className' => 'FoCMS.SitePage',
'foreignKey' => 'site_page_id',
),
);
public $hasMany = array(
'SitePageContent' => array(
'className' => 'FoCMS.SitePageContent',
'foreignKey' => 'site_page_group_id',
'dependent' => FALSE,
),
);
// SitePageContent Model
public $belongsTo = array(
'SitePageGroup' => array(
'className' => 'FoCMS.SitePageGroup',
'foreignKey' => 'site_page_group_id',
),
);
使用该链接问题中的答案,我看到父模型 SitePage
被复制,但相关模型正在从原始模型中删除并与新模型相关联。
$record = $this->SitePage->find('first', array('condition' => array('SitePage.id' => $id)));
unset($record['SitePage']['id'], $record['SitePageGroup']['id'], $record['SitePageGroup']['SitePageContent']['id'] /* further ids */);
$this->SitePage->create();
$record['SitePage']['name'] = $record['SitePage']['name'].'-copy';
$record['SitePage']['friendly_name'] = $record['SitePage']['friendly_name'].' Copy';
if($this->SitePage->saveAll($record)){
$this->Session->setFlash('The site page has been saved', 'fo_message');
$this->redirect(array('action' => 'index'));
}else{
$this->Session->setFlash('The site page could not be saved. Please, try again.', 'fo_message');
}
更新
调试我试图重置的记录我看到以下内容
array(
'SitePage' => array(
'name' => 'test',
'friendly_name' => 'Test',
'order' => '82',
'created' => '2015-09-03 19:16:40',
'modified' => '2015-09-03 19:20:27'
),
'SitePageGroup' => array(
(int) 0 => array(
'id' => '55e88087-a4dc-4c37-89dc-f9c172b40463',
'site_page_id' => '55e88078-16c8-46ce-bf02-fa5372b40463',
'name' => 'group-1',
'friendly_name' => 'Group 1',
'order' => '1',
'created' => '2015-09-03 19:16:55',
'modified' => '2015-09-03 19:16:55'
),
(int) 1 => array(
'id' => '55e8809e-d018-4ebe-a4cf-fbef72b40463',
'site_page_id' => '55e88078-16c8-46ce-bf02-fa5372b40463',
'name' => 'group-2',
'friendly_name' => 'Group 2',
'order' => '2',
'created' => '2015-09-03 19:17:18',
'modified' => '2015-09-03 19:17:18'
)
)
)
我得到这个结果的方法是这样做
$sitePage = $this->SitePage->find('first', array(
'conditions' => array(
'SitePage.id' => $id,
),
));
unset($sitePage['SitePage']['id'], $sitePage['SitePageGroup']['id'], $sitePage['SitePageGroup']['SitePageContent']['id'], $sitePage['SitePageGroup']['site_page_id'], $sitePage['SitePageGroup']['SitePageContent']['site_page_group_id'] /* further ids */);
debug($sitePage);
die();
但也正如您在调试输出中看到的那样,未包括关联模型的第 3 级,每个 SitePageGroup
还应该有一个 SitePageContent
我认为对 SitePageGroup
数组的简单循环应该重置 id 并将外键设置为 null,但我想我还需要以某种方式包含属于 SitePageContent
SitePageGroup
这样我也可以重置它们。
您需要确保所有的主键和外键在保存前都设置为null
。您似乎只是在重置模型的主键,但 Cake 需要知道需要生成外键,以便它们引用新记录。
在调用 $record
之前,可能值得使用 debug($record);
检查该数组中的所有内容是否已 set/reset 适当地确保副本将按预期工作。
更新
根据您在更新后的问题中发布的数组内容,您似乎没有从保存数据中删除所有主键和外键。您需要确保从您要保存的所有内容中删除这些内容,包括具有许多关联的内容。
如果您查看您的数组,您应该能够看到 unset($sitePage['SitePageGroup']['id'])
不会删除您的 SitePageGroup
数据的主要 ID,因为您正在取消设置的内容与中的数组路径不对应你的 $sitePage
数组。
您可以像这样使用 CakePHP 的 Hash utility to remove 数组中的主键:-
$sitePage = Hash::remove($sitePage, 'SitePageGroup.{n}.id');
外键也类似:-
$sitePage = Hash::remove($sitePage, 'SitePageGroup.{n}.site_page_id');