我有一个person
带有id
as 标识符列的表和一个student
带有person_id
as的表PRIMARY KEY
。该列student.person_id
引用 ( FOREIGN KEY
) person.id
。
相应地存在三个类:具有成员的abstract
类及其没有任何“标识属性”的子类。Person
id
Student
我正在尝试Class Table Inheritance
为此结构定义:
Person
use Doctrine\ORM\Mapping as ORM;
/**
* Parent
*
* @ORM\Table(
* name="person"
* ),
* @ORM\Entity
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="type", type="string")
*/
abstract class Person
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
}
Student
use Doctrine\ORM\Mapping as ORM;
/**
* Student
*
* @ORM\Table(name="student")
* @ORM\Entity
*/
class Student extends Person
{
}
但是当我尝试检索对象时
$testRepo = $entityManager->getRepository(Student::class);
$entities = $testRepo->findAll();
我遇到了一个例外。问题是,Doctrine 假设,表的标识列students
具有名称id
并构建SELECT
如下语句:
SELECT t1.id AS id_2,
t1.... AS ..._3,
...
FROM student t0
INNER JOIN `person` t1 ON t0.id = t1.id
代替
SELECT t1.id AS id_2,
t1.... AS ..._3,
...
FROM student t0
INNER JOIN `person` t1 ON t0.person_id = t1.id
并遇到错误
Error Code: 1054
Unknown column 't0.id' in 'on clause'
对于新系统,最简单、最干净的方法可能是重命名student.person_id
列。但我目前正在将现有系统迁移到 Doctrine 2,并希望尽可能多地让其迁移,只要迁移尚未完成。
如何通过使用不同的列名作为父表标识符和子表标识符(-s)在 Doctrine 2 中定义类表继承?