0

クラス B のオブジェクトを作成し、フォーム $B-> にアクセスしようとすると、A から継承するクラス A とクラス B、および A と A の比率がそれぞれ 1:M のクラス C (A、C) を持つC->attributeOfC は Doctrine_Record_UnknownPropertyException 'with message' をスローします 未知のレコード プロパティ / 関連コンポーネント

コードの簡単な例:

//A
class tableA extends Doctrine_Record{    
    public function setTableDefinition() {
        $this->hasColumn('tableA_id', 'integer', null, array(
            'primary' => true, 'autoincrement' => true));          
            $this->hasColumn('tableC_id','integer');
             $this->setSubclasses(array(
                'tableB'  => array('type' => 1)
            ));  }
    function setup() {
        $this->setTableName("tableA");
        $this->hasOne('tableC', array(
            'local' => 'tableC_id',
            'foreign' => 'tableC_id'
                ));    }
}
//B
class tableB extends tableA{
   public function setTableDefinition() {
        $this->hasColumn('tableB_id', 'integer', null, array(
            'primary' => true, 'autoincrement' => true));
            $this->hasColumn('tableA_id','integer');        
    }
    function setup() {
        $this->setTableName("tableB");
    }
}

//C
class tableC extends Doctrine_Record{   
    public function setTableDefinition() {
        $this->hasColumn('tableC_id', 'integer', null, array(
            'primary' => true, 'autoincrement' => true));
            $this->hasColumn('attributeOfC','string');
    }
    function setup() {
        $this->setTableName("tableC");
         $this->hasMany('tableA as Alias', array(
            'local' => 'tableC_id',
            'foreign' => 'tableC_id'
                )); }
}
 //some code where we create $objectOfCClass as an instance of tableCe
 $objectA = new $tableA(); 
 $objectA->tableC=$objectOfCClass;
 $objectA->save();
4

1 に答える 1

1

TableB の「setTableDefinition」など、サブクラスで関数を定義すると、親関数は呼び出されません。tableB setTableDefinition 関数で parent::setTableDefinition() を明示的に呼び出す必要があり、tableB setup 関数で parent::setup() を明示的に呼び出す必要があります。

//B
class tableB extends tableA{
   public function setTableDefinition() {
        parent::setTableDefinition();
        $this->hasColumn('tableB_id', 'integer', null, array(
            'primary' => true, 'autoincrement' => true));
            $this->hasColumn('tableA_id','integer');        
    }
    function setup() {
        parent::setup();
        $this->setTableName("tableB");
    }
}

これで、tableA と tableB は実際には異なる列を持つ異なるテーブルのように見えます。上記のコードは、tableA_id という列があることを tableB に伝えるため、壊れます。そのため、どのテーブルにどの列があるかに基づいてコードを移動する必要があります。「hasOne」呼び出しを tableB setTabledefinition 関数にコピーするだけです。

覚えておくべきことは、これはすべて、オブジェクトをセットアップする PHP コードにすぎず、これらのクラスの継承は、他の PHP クラスと同じように機能するということです。したがって、共通のものは親クラスに、異なるものは子クラスに持ち込んでください。

于 2011-06-04T17:30:43.923 に答える