在插入触发器更新和查询操作之后,我有一个插入序列,我的问题是从查询接收的数据不反映触发器执行的更新(即使数据库中的数据确实已更新)
我正在使用PHP,PostgreSQL和Propel 1.6 ORM(虽然这个问题可能是数据库和ORM不可知)。
我有以下顺序:
使用AJAX在“book_vote”表格中插入新行(投票)(包含列:'book_id','book_score','voter_id')。
插入触发器后有一个PostgreSQL来更新“book”表中相应的书“vote_count”和“average_score”列。
进行查询以获取“book”的新“vote_count”和“average_score”数据,并使用AJAX将该数据发送回客户端(在投票后显示更新的值)。
这一切都发生在同一个PHP会话中,我的问题是我没有在AJAX响应中获得更新的“book”值。似乎在执行数据库触发器之前执行查询。有没有办法确保在数据库触发后发生查询?
答案 0 :(得分:1)
在我看来,你正在对Propel对象进行保存,并且你有一个外部触发器可以进一步修改该行。您需要能够告诉Propel在插入/更新后对象需要立即刷新...并且谢天谢地,Propel直接支持。在架构中的table元素中,执行以下操作:
<table name="book_vote" reloadOnInsert="true" reloadOnUpdate="true">
您可以使用其中一个或两个重新加载语句,具体取决于要求(在您的情况下,您可能只需要插入一个)。从那里,只需重建你的模型,它应该工作正常。更多细节here。
附录:根据讨论,问题似乎是您已经加载了要重新加载的外部行,因此它是从实例池而不是数据库中检索的。你发现BookPeer::clearInstancePool()
为你解决了 - 太棒了!对于奖励积分,请查看您是否可以单独从池中删除项目 - 允许池正常运行并一次删除一个项目可能更有效,而不是清除池中的整个表。如果可能,请告诉我们!
答案 1 :(得分:0)
在ORM文档中查看如何在更新后重新获取数据。 您可以选择列,也可以调用某些方法。
同样的问题是,如果您有列和插入的默认值。