助けが必要ですか?
私には2つのクラスがあります。親クラスはPersonと言い、子はDoctrine2のクラステーブル継承マッピング戦略を使用するEmployeeと言います。クラスの対応するテーブルは、別々のデータベーステーブルに存在します。Personテーブルはデータベースに存在します:dbOneおよびEmployeeテーブルはdbTwoにあります。
クラスは次のようなものです。
/**
* @Entity
* @InheritanceType("JOINED")
* @DiscriminatorColumn(name="discr", type="string")
* @DiscriminatorMap({"person" = "Person", "employee" = "Employee"})
* @Table(name="Person")
*/
class Person
{
と子クラス
/**
* @Entity
* @Table(name="Employee")
*/
class Employee extends Person
{
Employeeテーブルのスキーマは次のようになります。
CREATE TABLE Employee (
id INT NOT NULL,
department VARCHAR(50) NOT NULL,
PRIMARY KEY(id)
) ENGINE = InnoDB;
ALTER TABLE Employee ADD FOREIGN KEY (id) REFERENCES **dbOne.Person**(id) ON DELETE CASCADE
実際には2つの問題があります。
- Doctrineはデータベースごとに1つのエンティティマネージャーをマップするので、
$ this-> entityManager-> flush();
Personオブジェクトでは、エラーのフラグが立てられます。
Message: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'dbOne.Employee' doesn't exist
エンティティマネージャ(dbTwoの場合)を呼び出してEmployeeオブジェクトを保存する場合は、その逆になります。テーブルが同じデータベースにある場合、問題は発生しません。この問題を回避するにはどうすればよいですか?また、flush()操作中にエンティティマネージャーが使用するSQLクエリを取得するにはどうすればよいですか?次のように、どのSQLが生成および使用されているかを知っておくと役立ちます。
$this->entityManager->getQuery();
//明らかにこれは私が何を意味するかを説明するためだけのものです
- 2番目の問題は、Doctrineにデータベーステーブルのdiscr列に正しい値を挿入させることです。@DiscriminatorMap詳細セットに従った人物です。これは、値が親インスタンス(つまり、Person)であるが、子インスタンス(つまり、Employee)ではない場合にうまく機能します。助けてくれてありがとう。