有一个大问题,令人困惑。我正在使用 Laravel(3.2.5 和现在的 3.2.7)并且我正在使用 Eloquent ORM 来更新数据库(PostgreSQL)。
这就是我正在做的事情:
- 我有一个充满数据的数据库
- 我正在从外部 API 中提取信息以更新我的数据库中的数据
- 我运行一个脚本,将充满数据的数据库放入数组中,并且与 API 相同。这得到了比较
- 我用一个充满变化的数组填充一个数据对象
- 我“保存”它
- 什么都没发生 -。-
$updateLinks = array_diff($dbLinkArray, $dbLinkArrayOriginal); $dbLink->fill($updateLinks); Log::info('1st LOG Original: '.$dbLinkArrayOriginal['link_text'].' New: '.$dbLinkArray['link_text']); Log::info('2nd Log Dirty: '.implode(', ', $dbLink->get_dirty())); $dbLink->保存(); Log::info('第 3 条日志应该被修改:'.implode(', ',array_keys($updateLinks)));
我使用了一些日志记录和调试工具栏来确定发生了 wtf。这是信息:
- 所有 SQL 查询都会运行以更新正确的信息。当通过 phpPgAdmin 运行查询时,它会按应有的方式更新。这里的问题是查询更新了行中的每一列,而不仅仅是更改。使用“更新”而不是“填充/保存”会产生同样的问题。
- 永远不会更新任何表信息。
- 第一个日志显示 link_text 不相等。这没关系,因为它表明 link_text 需要更新。但是,它清楚地表明下次我运行脚本时没有更新任何内容。日志每次都显示相同的信息,并且发生的日志事件也一样多。
- 第二个日志显示整个对象是脏的,而不仅仅是应该更新的。这就是 SQL 更新的原因
- 第三个日志准确地吐出应该更新的内容。最多 3-5 列,仅此而已。一切都是正确的格式。
知道为什么,首先,即使 Laravel 将 SQL 标记为正在运行并显示正确的查询,数据库也没有得到更新?
另外,知道为什么 ENTIRE 对象是脏的并且查询尝试更新整个对象(23 列以上)而不是只更新更改(3-5 列)吗?