2010-08-10 2 views
1

После ситуации:Возможно ли продлить модель с доктриной 2?

Родитель:

namespace Base; 

/** @Entity @Table(name="section") */ 
class Section extends Skeleton { 
/** 
* @Id @Column(type="integer") 
* @GeneratedValue(strategy="AUTO") 
*/ 
protected $id; 

/** @Column(length=256) */ 
protected $title; 

/** @Column(length=256) */ 
protected $stylesheet; 
} 

Ребенок:

namespace Base2; 

use \Base\Section AS BaseSection; 

/** @Entity @Table(name="tbl_section") */ 
class Section extends BaseSection { 
/** 
* @Id @Column(type="integer") 
* @GeneratedValue(strategy="AUTO") 
*/ 
protected $id; 

/** @Column(length=256) */ 
protected $title; 

/** @Column(length=256) */ 
protected $stylesheet; 
} 

Когда я пытаюсь извлечь раздел из базы данных он выдает ошибку:

PDOException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 't0.id' 
in 'where clause' in /var/www/eage_new_zf/library/Doctrine/DBAL/Connection.php 
on line 567 Call Stack #TimeMemoryFunctionLocation 10.0004489704{main}( 
)../index.php:0 20.03193296632Zend_Controller_Front->dispatch(???, ??? 
)../index.php:27 30.04574505172Zend_Controller_Dispatcher_Standard->dispatch( 
object(Zend_Controller_Request_Http)[39], object(Zend_Controller_Response_Http)[40] 
)../Front.php:954 Variables in local scope (#3) 

The запрос, который он пытается выполнить:

SELECT 
    t1.id AS id2, 
    t1.title AS title3, 
    t1.stylesheet AS stylesheet4 
FROM 
    tbl_section t1 
WHERE 
    t0.id = ? 

t0 не определен, так что технически это правильно. Я получаю сообщение об ошибке. Но как это решить? Это ошибка в Доктрине 2? Или я делаю что-то неправильно.

ответ

2

Вы можете использовать одиночный стол или наследование наследуемого стола. Разница заключается в использовании одной таблицы с нулевыми столбцами или использовании многих таблиц в зависимости от дочерних классов. Смотрите руководство для mroe информации:

http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/inheritance-mapping.html

В вашем случае на верхней/корневой класс (Base \ Section)

/** 
* @Entity @Table(name="section") 
* @InheritanceType("SINGLE_TABLE") 
* @DiscriminatorColumn(name="discr", type="string") 
* @DiscriminatorMap({"base" = "Base\Section", "child" = "Base2\Section"}) 
*/ 

Именование классов плохая практика Кстати, вы должны назвать свои классы в отношении того, что они делают. Даже если он дублирует слова, уже включенные в пространство имен, то есть Base \ BaseSection и BAse2 \ Base2Section в вашем примере.

+0

Спасибо за ваш ответ. Я полностью пропустил документацию, которую вы упомянули, но я полагаю, что это будет сделано. Я не знаю, согласен ли я с вами в последней части, но это только что-то личное, я думаю. Спасибо за предложение в любом случае. –

+0

Ссылка мертва, вот новая: http://doctrine-orm.readthedocs.org/en/latest/reference/inheritance-mapping.html;) –