CakePHP v3:如何让patchEntity更新请求数据中的关联
我正在使用CakePHP v3:如何让patchEntity更新请求数据中的关联,php,cakephp,cakephp-3.0,Php,Cakephp,Cakephp 3.0,我正在使用patchEntity()来更新它,它有许多关联,而且运行良好。我的问题与数据库中保存的数据无关。我的问题是实体变量中存储的关联数据不同步 请注意,在下面的方法中,我必须在保存后执行第二次get(),以从数据库中重新读取数据。如果删除此项,下一个视图将显示过时的关联数据,因为patchEntity更新外键,但实际的关联对象仍然是上一个(保存之前) 我希望有一种方法可以避免连续进行两次DB查询。这是故意的行为吗?有更好的方法吗 public function edit($id = nul
patchEntity()
来更新它,它有许多关联,而且运行良好。我的问题与数据库中保存的数据无关。我的问题是实体变量中存储的关联数据不同步
请注意,在下面的方法中,我必须在保存后执行第二次get()
,以从数据库中重新读取数据。如果删除此项,下一个视图将显示过时的关联数据,因为patchEntity更新外键,但实际的关联对象仍然是上一个(保存之前)
我希望有一种方法可以避免连续进行两次DB查询。这是故意的行为吗?有更好的方法吗
public function edit($id = null)
{
//1//////////////////////////////////////////
$screen = $this->Screens->get($id, [
'contain' => ['Blocks'=>['Datasources'=>['Agencies']]]
]);
if ($this->request->is(['patch', 'post', 'put'])) {
$screen = $this->Screens->patchEntity( $screen,
$this->request->data,
[
'associated'=>['Blocks.Datasources']
]
);
if ($this->Screens->save($screen)) {
//2//////////////////////////////////////////
#get the UPDATED properties... specifically, the associations don't get updated automatically by patchEntity above
$screen = $this->Screens->get($id, [
'contain' => ['Blocks'=>['Datasources'=>['Agencies']]]
]);
$this->Flash->success('The screen has been saved.');
} else {
$this->Flash->error('The screen could not be saved. Please, try again.');
}
}
$this->set(compact('screen'));
}
当然,没有办法避免第二个查询。即使框架实现了该功能,它也需要使用另一个查询来查找与最新数据的关联
因此,虽然这看起来很浪费,但这是唯一的方法。这与不完全相同,但答案是一样的。您应该在成功保存后重定向,通常是重定向到“视图”或“索引”页。@GregSchmidt我理解为什么这样做,但解决方案比我现在做的还要昂贵。对于任何好奇的人来说,这个链接上的答案就是在保存后进行重定向。。。这将重置/重做所有事情除了我无法根据您的描述获得图片(数据、修补的数据和保存的实体到底是什么样子?),另一个DB读取或重定向“昂贵”吗?这并不是说你的操作每秒要处理1000个请求,或者是吗?@ndm我的意思是,我之所以要问这个问题,首先是因为在保存开始时执行
$this->Screens->get(…)
,然后在保存后立即执行,似乎是浪费时间。听起来似乎没有办法避免它,但严格地说,从资源的角度来看,我目前的做法比Greg提供的解决方案更有效,因为它创建了一个全新的请求,所有的db调用都会重复。这是我唯一的观点。谢谢你,何塞。关于是否使用第二个查询重置变量(正如我正在做的)或执行重定向,有什么建议吗?格雷格评论中的解决方案说,在这种情况下,你应该始终重定向……重定向有一个优点,即如果用户试图单击“后退”按钮,你将避免恼人的浏览器行为。您还将在cotroller:P中保存一些代码