私には 2 つのクラスがあり、そのうちの 1 つは 2 番目のクラスの前に完全に開発されました。2 つ目の開発に至ったとき、基本的には同じで機能が追加されていたため、PHP でクラスを拡張しました。
親クラス ClassA と子クラス ClassB を呼び出しましょう (簡潔にするためにゲッター/セッターを省略しています):
class ClassA
{
protected $label;
protected $name;
}
class ClassB extends ClassA
{
protected $extraField;
}
しかし、それをマッピングするようになったとき、問題が発生しました。ポリモーフィック クエリが必要ないため、継承マッピングは必要ありません。両方のクラスがサイトの異なるセクションで使用されており、ClassA のクエリを実行するときに ClassB のインスタンスを返したくありません。ClassA のインスタンスを直接返すためだけです。
ClassA の属性を ClassB のマッピングから除外することで、マッピングを機能させました (そうしないと、フィールドが重複していると不平を言いました)。
ClassA.dcm.xml:
<?xml version="1.0" encoding="UTF-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
<entity name="ClassA" table="a">
<id name="id" type="integer" column="id">
<generator strategy="AUTO" />
</id>
<field name="label" type="string" nullable="true"/>
<field name="name" type="text" nullable="true"/>
</entity>
</doctrine-mapping>
ClassB.dcm.xml:
<?xml version="1.0" encoding="UTF-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
<entity name="ClassB" table="b">
<field name="extraField" type="string" nullable="true"/>
</entity>
</doctrine-mapping>
これにより、すべての必須フィールドを含むデータベース テーブルが正しく生成されました。ただし、クエリを実行する場合:
$em->createQuery('SELECT b FROM ClassB')->getResult();
次に例外がスローされます。これは、Doctrine がこの MySQL クエリを、マッピングしていないにもかかわらず、継承を賢くしようとして生成しているためです。
SELECT c0_.label AS label0, c0_.name AS name1, c0_.id AS id2, c1_.extraField AS extraField3 FROM b c1_
ご覧のとおり、エイリアスを指定して A テーブルから列をフェッチしようとしていますが、B テーブルからのみフェッチする必要があり、最初の列が存在しないと不平を言っています。
Single-Table 継承または Class-Table 継承を使用せずに(ポリモーフィック クエリが必要ないため)、または追加のクラスを作成しなくても (マップされたスーパークラスが必要とする)、私が望むものを達成する方法はありますか?
MySQL と PHP 5.3 で Doctrine 2.3.3 (最新バージョン) を使用しています。