Doctrine 1.2 ORM унаследованный класс не может получить доступ к его родительским отношениям
Имея класс A и класс B, который наследуется от A, и класс C, к которому A имеет отношение 1: M соответственно (A, C), при создании объекта класса B и попытке доступа к форме $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 ответ
Когда вы определяете функцию в подклассе, таком как "setTableDefinition" в TableB, она не вызывает родительскую функцию. Вам необходимо явно вызвать parent::setTableDefinition() в функции tableB setTableDefinition, а также parent::setup() в функции настройки tableB.
//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. Так что принесите вещи, которые являются общими в родительский класс, и вещи, которые отличаются от детей.