以下情况:
父:
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;
}
当我尝试从数据库中检索一个Section时,它会抛出一个错误:
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中的错误吗?或者我做错了什么。
答案 0 :(得分: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"})
*/
命名类是一个不好的做法btw,你应该根据他们正在做的实现明确命名你的类。即使它复制了名称空间中已经包含的单词,例如你的例子中的Base \ BaseSection和BAse2 \ Base2Section。