2011-05-18 75 views
0

具有繼承自A的類A和類B以及分別具有比率1:M(A,C)的類C(創建B類的對象,並試圖訪問形式$ B-> C-> attributeOfC「與消息」拋出Doctrine_Record_UnknownPropertyException未知記錄屬性/相關分量Doctrine 1.2 ORM繼承了類對其父關係的訪問

在代碼的簡單示例:

//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

當定義子類中的函數,如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"); 
    } 
} 

現在,它看起來像表A和tableB的實際上是與不同的列不同的表,上面的代碼將打破,因爲它會告訴tableB的,它有一個叫tableA_id列。所以你必須根據哪些表具有哪些列來移動代碼。您可以將他「hasOne」調用複製到tableB setTabledefinition函數中。

需要記住的是,這只是PHP代碼設置對象,而這些類的繼承與其他PHP類的工作方式相同。因此,將常見的東西帶入父類,並將不同的東西帶入孩子。