Php 原则1.2 ORM继承类不能访问其父关系
当创建类B的对象并尝试访问表单$B->C->attributeOfC时,从A继承的类A和类B,以及A与类C的比率分别为1:M(A,C)的类A和类C抛出带有消息“Unknown Record property/related component”的原则\u Record\u Unknown property Exception 代码中的一个简单示例:Php 原则1.2 ORM继承类不能访问其父关系,php,inheritance,orm,doctrine,database-relations,Php,Inheritance,Orm,Doctrine,Database Relations,当创建类B的对象并尝试访问表单$B->C->attributeOfC时,从A继承的类A和类B,以及A与类C的比率分别为1:M(A,C)的类A和类C抛出带有消息“Unknown Record property/related component”的原则\u Record\u Unknown property Exception 代码中的一个简单示例: //A class tableA extends Doctrine_Record{ public function setTable
//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();
在子类中定义函数时,如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实际上是具有不同列的不同表,上面的代码将中断,因为它将告诉tableB它有一个名为tableA_id的列。因此,您必须根据哪些表具有哪些列来移动代码。您可以将“hasOne”调用复制到tableB setTabledefinition函数中
//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");
}
}
需要记住的是,这只是设置对象的PHP代码,这些类的继承与其他PHP类的工作方式相同。因此,将常见的东西带到父类中,将不同的东西带到子类中