3

挿入トリガー更新後の挿入シーケンスとクエリ操作がありますが、クエリから受け取ったデータがトリガーによって実行された更新を反映していないという問題があります(データベース内のデータは実際に更新されています)。

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. クエリを実行して、「本」の新しい「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()それがあなたのためにそれを解決したことを発見しました-素晴らしいです!ボーナスポイントについては、プールからアイテムを個別に削除できるかどうかを確認してください。テーブル全体のプールをクリアするよりも、プールを正常に実行し、アイテムを1つずつ削除する方がおそらく効率的です。これが可能かどうかお知らせください。

于 2012-10-06T10:03:55.967 に答える
0

更新後にデータを再フェッチする方法については、ORMのドキュメントを参照してください。列のオプションがある場合や、何らかのメソッドを呼び出す必要がある場合があります。

同じ問題は、列と挿入のデフォルト値がある場合です。

于 2012-10-03T16:35:57.873 に答える