2016-04-07 4 views
1

私のDoctrineレコードクラスの1つで、チェックを実行するpreSaveメソッドがあります。このチェックでは、レコードが属するテーブルと同じテーブルに対してクエリが実行されます。このクエリはテーブルから1つのレコードをフェッチし、水和結果を使用してクラスが表す現在のレコードと比較します。Doctrineレコードクラス内から、DBから同じレコードをクエリすると、そのクラス内のプロパティが上書きされます。

場合によっては、取り出した水和結果は、preSaveチェックで作業しているものと同じレコードになります。しかし、これが起こると、最初のレコードに加えた変更は、クエリが完了すると元に戻ります。

どうしてですか?回避策はありますか?

答えて

1

Doctrineは、レコードオブジェクトインスタンスへの単一の参照を保持していて、preSave()メソッドで完全な新しいインスタンスを作成していない可能性があります。したがって、オブジェクトが水和されると、コード内の同じタイプの他の変数がすべてリフレッシュされます。

これを確認するには、spl_object_hash()関数を使用して、コード内の変数のオブジェクトIDを調べます。

あなたのコードを見ることなく、回避策の提案を変化させることができるが、一つの可能​​な回避策はpreSave()で配列水和することです:あなたがオブジェクトとして結果を使用する能力を失うことになる

$query = Doctrine_Query::create() 
->select('foo') 
->from('Bar b') 
->where('b.id = ?', $id); 

$results = $query->execute(array(), Doctrine::HYDRATE_ARRAY); 

を、あなた比較のために配列の内容を使用することができます。

関連する問題