Php Laravel(雄辩)不更新数据库

Php Laravel(雄辩)不更新数据库,php,postgresql,laravel,laravel-3,Php,Postgresql,Laravel,Laravel 3,有个大问题让人很困惑。我正在使用Laravel(3.2.5,现在是3.2.7),我正在使用有说服力的ORM来更新数据库(PostgreSQL) 以下是我正在做的: 我有一个数据库充满了数据 我从一个外部API中提取信息来更新我的数据库中的全部数据 我运行了一个脚本,将数据库中充满数据的数据放入数组中,并使用API将其放入数组中。这是可以比较的 我用一个充满变化的数组填充数据对象 我“保存”它 什么也没发生- $UpdateLink=array_diff($dbLinkArray,$dbLin

有个大问题让人很困惑。我正在使用Laravel(3.2.5,现在是3.2.7),我正在使用有说服力的ORM来更新数据库(PostgreSQL)

以下是我正在做的:

  • 我有一个数据库充满了数据
  • 我从一个外部API中提取信息来更新我的数据库中的全部数据
  • 我运行了一个脚本,将数据库中充满数据的数据放入数组中,并使用API将其放入数组中。这是可以比较的
  • 我用一个充满变化的数组填充数据对象
  • 我“保存”它
  • 什么也没发生-
$UpdateLink=array_diff($dbLinkArray,$dbLinkArrayOriginal); $dbLink->fill($updateLinks); 日志::信息('1st Log Original:'.$dbLinkArrayOriginal['link_text'.'新:'.$dbLinkArray['link_text']); 日志::信息('2nd Log Dirty:'。内爆(',',$dbLink->get_Dirty()); $dbLink->save(); 日志::信息('应该更改的第三个日志:'。内爆(',',数组_键($updateLinks)); 我使用了一些日志记录和调试工具栏来确定wtf发生了什么。以下是信息:

  • 所有SQL查询都会运行以使用正确的信息进行更新。当查询通过phpPgAdmin运行时,它会按原样更新。这里的问题是查询会更新行中的每一列,而不仅仅是更改。使用“更新”而不是“填充/保存”会产生相同的问题
  • 没有一个表信息得到更新
  • 第一个日志显示链接文本不相等。这没关系,因为它显示链接文本需要更新。但是,很明显,下次运行脚本时没有更新任何内容。日志每次都显示相同的信息,发生的日志事件也一样多
  • 第二个日志显示整个对象是脏的,而不仅仅是应该更新的对象。这就是SQL得到更新的原因
  • 第三个日志显示了应该更新的内容。最多3-5列,仅此而已。一切都是正确的格式
你知道为什么,首先,即使Laravel将SQL标记为正在运行并显示正确的查询,数据库也没有得到更新吗

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

关于第二个问题(为什么所有列都更新,而不仅仅是脏列)。Laravel文件说明:

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

这对你有帮助吗

亲切问候,,
亨德里克

第一期听起来像是自动提交/交易问题。你在做这项工作吗?据我所知,拉雷维尔是自动做这项工作的;然而,我可能错了。您将如何提交更新?您是在每次SQL查询之后还是在完成整个脚本之后执行此操作?也很好的捕捉。我甚至没有想到,只是假设Laravel会自动完成。不知道,我不做PHP,也不知道除了标签描述之外Laravel是什么。未提交事务的问题只是“SQL运行但数据未出现在数据库中”问题的常见原因。可以在
postgresql.conf
中启用
log\u statement='all'
log\u line\u prefix='%d%p'
,查看是否可以在日志中找到
BEGIN
s而不匹配
COMMIT
s?或者查看
pg_stat_activity
并查看事务条目中是否有
?他们的存在强烈暗示着悬而未决的交易;他们的缺席并不排除他们,只有日志检查才能做到这一点。
$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)));