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中保存一些代码