【问题标题】:Find call returning outdated info immediately after Save保存后立即查找返回过时信息的呼叫
【发布时间】:2014-07-07 19:57:24
【问题描述】:

在我的应用程序中,操作接受一些用户生成的输入并使用它来更新数据库中的条目。

相关代码如下:

$this->Model->save($data);
$result = $this->Model->findById($id);

问题是 $result 的内容已经过时了。也就是说,$result 包含的记录与保存之前的一样

我假设该条目在函数返回之前不会更新。但是,我做不到明显的

$result = $this->Model->save($data);

因为这种方法不保留关系。在这种情况下,模型属于另一个模型。我需要能够获取更新的记录它所属的记录。

【问题讨论】:

  • 那么什么时候 它正在更新(不要只是假设,弄清楚)?您使用的是什么 DBMS/存储引擎?另外,请始终提及您的确切 CakePHP 版本并相应地标记您的问题!
  • 您确定记录实际上正在更新吗?尝试将其包装在 if($this->Model->save($data)) { $result = $this->Model=>...}
  • 记录正在更新中。下次刷新页面时,返回正确的数据。

标签: mysql cakephp cakephp-1.3


【解决方案1】:

看看有没有

$result = $this->Model->findById($id); 

正在从缓存加载,而不是从数据库加载。

看看: http://fredericiana.com/2007/09/05/cakephp-delete-cached-models-on-database-change/ http://snook.ca/archives/cakephp/delete_cached_models/

【讨论】:

    【解决方案2】:

    就我个人而言,我从不喜欢 Cake 的神奇查找功能。我发现它们很难添加额外的条件/连接/等,我更喜欢输入更多的行并获得一些我可以轻松调整的特定内容。

    在这种情况下,听起来好像神奇的 find 函数正在从缓存中返回,您应该尝试使用常规的 find 调用:

    $this->Model->save($data);
    $result = $this->Model->find('first', array('conditions' => array('id' => $id)));
    

    但是,您应该尝试缩小问题范围,并准确找出问题所在,以供将来参考。您可以先手动尝试clearing the cache,然后再进行魔法查找,看看是否得到正确响应:

    $this->Model->save($data);
    Cache::clear();
    $result = $this->Model->findById($id);
    

    另一个不太可能但可能的选项是您的 $id 变量可能未指向正确的模型行,并且您的保存可能正在创建一个新的,因此当您 findById($id)$id 与 ID 不同您刚刚保存/创建的行。在这种情况下,值得在您的保险箱之前和之后执行debug($id)$this->log('ID is: ' . $id, 'my_test_log');,或者每隔一段时间通过您的代码来确定发生了什么以及发生在哪里。

    【讨论】:

    • 我目前正在处理一个只有一个条目的表,所以我知道我的 ID 正确。我会尝试您的其他解决方案,但我已经找到了解决方法。
    • 好的,所以,切换到正常查找会产生相同的结果。清除缓存也是如此,这让我很惊讶。
    猜你喜欢
    • 2018-02-24
    • 1970-01-01
    • 1970-01-01
    • 2012-08-24
    • 2017-06-25
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多