2

我有一个person带有idas 标识符列的表和一个student带有person_idas的表PRIMARY KEY。该列student.person_id引用 ( FOREIGN KEY) person.id

相应地存在三个类:具有成员的abstract类及其没有任何“标识属性”的子类。PersonidStudent

我正在尝试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 中定义类表继承?

4

1 回答 1

-6

(代表 OP 发布解决方案)

由于我迫切需要解决此问题的方法,因此我通过将标识符列重命名为id.

于 2017-08-19T19:17:21.877 回答