0

私はPropelであらゆる種類のことを行っていますが、これはおそらくビットエッジケースです-具体的には、テーブル名に関連付けられたクラス名がどこかにキャッシュされていることを発見しました。クラス名は異なるがテーブル名が同じであるモデルを再構築したためです(単体テスト用)目的)Propelは正しいピクルスに入っています。(この質問にはPropelの経験は必要ありません。PHPを理解しているだけで、おそらく特に魔法の呼び出しです)

この問題をデバッグするために、列の値が設定されているときにPropelがテーブルの「tablemap」クラスにデータを入力することを発見しました。私の意図は、このポピュレーションがコードのどこで発生するかを解明することです。これにより、Propelでキャッシュされたテーブルマップをクリアできます。

具体的には、クラスTestOrganiserには生成された親BaseTestOrganiserがあり、これには列セッターメソッドがあります。

// The ** lines are mine, the rest are auto-generated by propel.
// The output when setting a value and saving is "no yes " which
// shows that the '$this->modifiedColumns[]' line triggers the
// tablemap population
public function setName($v)
{
    if ($v !== null) {
        $v = (string) $v;
    }

    if ($this->name !== $v) {
        $this->name = $v;

        $map = Propel::getDatabaseMap('test'); // **
        echo $map->getTables() ? 'yes ' : 'no '; // **
        $this->modifiedColumns[] = TestOrganiserPeer::NAME;
        echo $map->getTables() ? 'yes ' : 'no '; // **
    }

    return $this;
} // setName()

コメントによると、$ map-> getTables()の値は、$this->modifiedColumns[] = TestOrganiserPeer::NAME行の結果として空から非空に移動します。ただし、このクラスまたはその子または親には__set()メソッドがないため、ここでどのコードをトリガーできるかについてはかなり不思議に思っています。

何か案は?

4

1 に答える 1

1

D'oh!後から考えると、それは非常に明白です!

印刷する行を追加してdebug_backtrace()、テーブルマップの作成をトリガーするコードを見つけました。これは最終的に、TestOrganiserPeerPropelのオートローダーをトリガーすることを示しており、ピアクラスがロードされると、すぐに。が呼び出されBaseTestOrganiserPeer::buildTableMap()ます。

于 2011-11-20T22:31:18.760 に答える