3

有一个大问题,令人困惑。我正在使用 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 列)吗?

4

1 回答 1

2

对于您的第二个问题(为什么所有列都更新,而不仅仅是脏的)。Laravel 文档指出:

默认情况下,所有属性键/值对都将在批量分配期间存储。但是,可以创建将要设置的属性的白名单。如果设置了可访问属性白名单,则在批量分配期间不会设置除指定属性之外的任何属性。

这对你有帮助吗?

亲切的问候,亨德里克

于 2012-09-05T00:01:59.687 回答