2012-09-04 93 views
2

有一个大的问题,就是地狱混乱。我使用的是Laravel(3.2.5和现在的3.2.7),我使用Eloquent ORM来更新数据库(PostgreSQL)。Laravel(雄辩)不更新数据库

下面是我在做什么:

  • 我有一个分贝完整的数据
  • 我从外部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->save(); 

    Log::info('3rd Log Supposed to be changed: '.implode(', ',array_keys($updateLinks))); 

我采用了一些日志和调试工具栏弄清楚跆拳道发生了。这里的信息:

  • 所有的SQL查询运行更新与正确的信息。当查询通过phpPgAdmin运行时,它会根据情况进行更新。这里的问题是查询更新行中的每一列而不仅仅是更改。使用“更新”而不是“填写/保存”会产生同样的问题。
  • 没有任何表信息被更新。
  • 第一个日志显示link_text不相等。这是可以的,因为它显示link_text需要更新。但是,这是一个明确的指示,下次运行脚本时没有更新。日志每次显示相同的信息,同样多的日志事件发生。
  • 第二届日志显示整个对象是脏的,而不仅仅是什么应该被更新。这就是为什么SQL得到更新
  • 第三日志吐出什么是应该进行更新。最多3-5列,就是这样。所有格式都是正确的。

任何想法为什么首先,即使Laravel将SQL标记为正在运行并显示正确的查询,数据库仍未得到更新?

此外,任何想法,为什么整个对象是脏和查询尝试更新整个对象(23+列),而不是只将更改(3-5列)?

+0

第1期听起来像自动提交/事务问题。你在做这项工作吗? –

+0

据我所知,Laravel自动执行此操作;不过,我可能是错的。你将如何提交更新?你会在每次SQL查询之后或整个脚本完成后执行它吗?也很好捕获。甚至没有想到它,只是假设Laravel会自动做到这一点。 – antjanus

+0

不知道,我没有做PHP,也不知道Laravel超出了标签描述。未提交事务的问题仅仅是“SQL运行但数据未出现在数据库中”问题的常见原因。也许在'postgresql.conf'中启用'log_statement ='all''和'log_line_prefix ='%d%p''并查看是否可以在日志中找到没有匹配'COMMIT'的BEGIN?或者查看'pg_stat_activity',看看在交易记录中是否有'?他们的存在强烈暗示着摇摆不定的交易;他们的缺席并不排除他们,只有日志审查将这样做。 –

回答

2

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

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

这是否帮助你吗?

亲切的问候, 亨德里克

+0

是的,帮助,谢谢:) – antjanus