Можно ли расширить модель с помощью Doctrine 2? - PullRequest
1 голос
/ 10 августа 2010

Следующая ситуация:

Родитель:

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) 

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

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

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

1 Ответ

2 голосов
/ 10 августа 2010

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

http://docs.doctrine -project.org / проекты / Доктрина-ОРМ / ен / 2.0.x / ссылки / наследования 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 в вашем примере.

...