Doctrine 1.2 ORM继承的类无法访问其父关系

时间:2011-05-18 22:21:17

标签: php inheritance orm doctrine database-relations

在创建类B的对象并尝试访问表单$时,具有继承自A的类A和类B,以及A的比例分别为1:M的类C(A,C) B-> C-> attributeOfC抛出Doctrine_Record_UnknownPropertyException',并显示消息'未知记录属性/相关组件

代码中的一个简单示例:

//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();

1 个答案:

答案 0 :(得分:1)

在子类中定义函数时,例如TableB中的“setTableDefinition”,它不会调用父函数。您需要在tableB setTableDefinition函数中显式调用parent :: setTableDefinition(),以及tableB安装函数中的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实际上是具有不同列的不同表,上面的代码将会中断,因为它会告诉tableB它有一个名为tableA_id的列。因此,您必须根据哪些表包含哪些列来移动代码。您可以将“hasOne”调用复制到tableB setTabledefinition函数中。

要记住的是,这只是设置对象的PHP代码,这些类的继承与其他PHP类的工作方式相同。因此,将常见的东西带入父类,以及与孩子们不同的东西。