3

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

我正在使用 PHP、PostgreSQL 和 Propel 1.6 ORM(尽管这个问题可能与数据库和 ORM 无关)。

我有以下顺序:

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

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

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

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

4

2 回答 2

1

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

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

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

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

于 2012-10-06T10:03:55.967 回答
0

请参阅 ORM 文档如何在更新后重新获取数据。您可能有列选项,或者您必须调用某些方法。

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

于 2012-10-03T16:35:57.873 回答