【问题标题】:Doctrine 1.2 ORM inherited class cant acces to its parent relationsDoctrine 1.2 ORM继承类可以访问其父关系
【发布时间】:2011-08-28 10:43:20
【问题描述】:

当创建类B的对象并试图访问表单$ B->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();

【问题讨论】:

    标签: php inheritance orm doctrine database-relations


    【解决方案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 类的工作方式相同。因此,将共同的东西带入父类,将不同的东西带入子类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-26
      • 2016-06-05
      • 2017-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多