1

私には 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 (最新バージョン) を使用しています。

4

0 に答える 0