Можно ли расширить модель с доктриной 2?
-
27-09-2019 - |
Вопрос
Следующая ситуация:
Родитель:
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 не определен так технически правильно, я получаю ошибку. Но как это решить? Это ошибка в доктрине 2? Или я делаю что-то не так.
Решение
Вы можете использовать одну таблицу, либо присоединившуюся наследование таблицы. Разница использует одну таблицу с Nullable Columns, либо использовать много таблиц в зависимости от дочерних классов. Смотрите руководство по информации MROE:
В вашем случае на верхнем / корневом классе (разделе раздел)
/**
* @Entity @Table(name="section")
* @InheritanceType("SINGLE_TABLE")
* @DiscriminatorColumn(name="discr", type="string")
* @DiscriminatorMap({"base" = "Base\Section", "child" = "Base2\Section"})
*/
Классы именования - это плохая практика, кстати, вы должны назвать ваши занятия в отношении того, что они выполняют реализацию мудрых. Даже если он дублирует слова, уже включенные в пространство имен, то есть база baseion и base2 base2section в вашем примере.