Laravel (Eloquent) 不更新数据库

Posted

技术标签:

【中文标题】Laravel (Eloquent) 不更新数据库【英文标题】:Laravel (Eloquent) Not Updating Database 【发布时间】:2012-08-29 05:03:42 【问题描述】:

遇到了一个令人困惑的大问题。我正在使用 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 需要更新。但是,它清楚地表明下次我运行脚本时没有更新任何内容。日志每次都显示相同的信息,并且发生的日志事件也一样多。 第二个日志显示整个对象是脏的,而不仅仅是应该更新的对象。这就是更新 SQL 的原因 第三个日志准确地吐出了应该更新的内容。最多 3-5 列,仅此而已。而且格式正确。

知道为什么,首先,即使 Laravel 将 SQL 标记为正在运行并显示正确的查询,数据库也没有得到更新?

另外,知道为什么 ENTIRE 对象是脏的并且查询尝试更新整个对象(23 列以上)而不是只更新更改(3-5 列)吗?

【问题讨论】:

第一个问题听起来像自动提交/事务问题。你在做这项工作吗? 据我所知,Laravel 会自动执行此操作;但是,我可能错了。您将如何提交更新?您会在每个 SQL 查询之后还是在整个脚本完成之后执行此操作?也很好抓。甚至没有想到,只是假设 Laravel 会自动执行此操作。 不知道,我不做PHP,不知道Laravel除了标签描述之外还有什么。未提交事务的问题只是“SQL 运行但数据未出现在数据库中”问题的常见原因。也许在postgresql.conf 中启用log_statement='all'log_line_prefix='%d %p',看看是否可以在日志中不匹配COMMITs 的情况下找到BEGINs?或者查看pg_stat_activity 看看是否有<IDLE> in transaction 条目?它们的存在强烈暗示了悬空交易;他们的缺席并不排除他们,只有日志检查才能做到这一点。 【参考方案1】:

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

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

这对你有帮助吗?

亲切的问候, 亨德里克

【讨论】:

以上是关于Laravel (Eloquent) 不更新数据库的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent - 保存/更新相关的一对多关系数据

Laravel Eloquent - 更新()函数

如何在 laravel 5 中使用 Eloquent 更新数据透视表

使用 Laravel Eloquent 使用复合键更新表

通过 eloquent 更新 laravel 中的多行

Laravel Eloquent 方法 updateOrCreate 更新时超过执行时间