Doctrine 1.2 ORM унаследованный класс не может получить доступ к его родительским отношениям - PullRequest
0 голосов
/ 19 мая 2011

имея класс 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 Ответ

1 голос
/ 04 июня 2011

Когда вы определяете функцию в подклассе, например "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 в функцию tableTabledefinition tableB.

Следует помнить, что это всего лишь код PHP, устанавливающий объекты, и наследование этих классов работает так же, как и другие классы PHP. Поэтому внесите в родительский класс то, что является общим, и то, что отличается от детей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...