数据库触发器更新列后如何进行查询?

时间:2012-10-03 14:14:29

标签: php postgresql propel

在插入触发器更新和查询操作之后,我有一个插入序列,我的问题是从查询接收的数据不反映触发器执行的更新(即使数据库中的数据确实已更新)

我正在使用PHP,PostgreSQL和Propel 1.6 ORM(虽然这个问题可能是数据库和ORM不可知)。

我有以下顺序:

  1. 使用AJAX在“book_vote”表格中插入新行(投票)(包含列:'book_id','book_score','voter_id')。

  2. 插入触发器后有一个PostgreSQL来更新“book”表中相应的书“vote_count”和“average_score”列。

  3. 进行查询以获取“book”的新“vote_count”和“average_score”数据,并使用AJAX将该数据发送回客户端(在投票后显示更新的值)。

  4. 这一切都发生在同一个PHP会话中,我的问题是我没有在AJAX响应中获得更新的“book”值。似乎在执行数据库触发器之前执行查询。有没有办法确保在数据库触发后发生查询?

2 个答案:

答案 0 :(得分:1)

在我看来,你正在对Propel对象进行保存,并且你有一个外部触发器可以进一步修改该行。您需要能够告诉Propel在插入/更新后对象需要立即刷新...并且谢天谢地,Propel直接支持。在架构中的table元素中,执行以下操作:

<table name="book_vote" reloadOnInsert="true" reloadOnUpdate="true">

您可以使用其中一个或两个重新加载语句,具体取决于要求(在您的情况下,您可能只需要插入一个)。从那里,只需重建你的模型,它应该工作正常。更多细节here

附录:根据讨论,问题似乎是您已经加载了要重新加载的外部行,因此它是从实例池而不是数据库中检索的。你发现BookPeer::clearInstancePool()为你解决了 - 太棒了!对于奖励积分,请查看您是否可以单独从池中删除项目 - 允许池正常运行并一次删除一个项目可能更有效,而不是清除池中的整个表。如果可能,请告诉我们!

答案 1 :(得分:0)

在ORM文档中查看如何在更新后重新获取数据。 您可以选择列,也可以调用某些方法。

同样的问题是,如果您有列和插入的默认值。