2017-08-19 7 views
0

私はテーブルpersonidを識別子欄に有し、テーブルstudentperson_idPRIMARY KEYとして持っています。列student.person_idFOREIGN KEY)のperson.idを参照してください。 abstractクラスPersonメンバーidとそのサブクラッセ任意の「特定資産」なしStudentを持つ:Doctrine 2で異なるID列の名前を持つテーブルにクラステーブルの継承を設定する方法は?

はそれに応じて三つのクラスがあります。

私はこのような構造のため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は名前idを持っており、このようなSELECT声明構築するために、テーブルstudentsの識別列を想定して、次のとおりです。

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でクラステーブルの継承を定義する方法はありますか?

+0

問題ではなく、* answersセクション*に解決策(回避策であっても)を入力してください。以前は正しく削除されていました。削除してください。あなたは下の答えとしてそれを投稿することは自由です。 –

答えて

-3

(OPに代わって掲載された解決策)

私はこの問題の解決策が緊急に必要だったので、識別子列の名前をidに変更することで解決しました。

+0

これは解決策ではありません。これを削除してください。 – automatix

+0

@automatix:あなたの質問を編集して、問題が解決したことを示しました。そして、あなたはそれを復元しました。人々はそれを見て、それがあなたの満足のために解決されたと信じます。そのアップデートを変更して、部分的な解決策(「回答の1つを参照」)があることを言い、他の何かを求めていることをお勧めします(そして、より良い解決策がどのように見えるか、理想的)。 – halfer

+0

@automatix:あなたが投稿した回避策*です。それは他人を助ける解決策であり、回答セクションに属します。それをここに掲示すれば、他の人がより良い解決策を投稿することを妨げることはありません。 –

関連する問題