3

他のエンティティ (現時点では不明) の基本クラスとして使用したいエンティティがあり、基本エンティティに関係を格納する必要があります。

/**
 * @ORM\Entity
 * @ORM\Table(name="CMS_content")
 */
class BaseContent {
    /**
     * @ORM\ManyToOne(targetEntity="BaseContent")
     * @ORM\JoinColumn(name="parent", referencedColumnName="id", unique=false)
     */
    protected $parent;

    /**
     * @ORM\ManyToOne(targetEntity="ContentType")
     * @ORM\JoinColumn(name="content_type", referencedColumnName="id", unique=false)
     */
    protected $contentType;
    ...
};

/**
 * @ORM\Entity
 * @ORM\Table(name="CMS_whateverSpecializedContent")
 */
class WhateverSpecializedContent extends BaseContent {};

@ORM\InheritanceType("JOINED")基本クラスに触れずに、後で任意の数のサブクラスを作成できるようにしたいので、使用できません。また、関係が意味を持つように、別のデータベース テーブルに基本クラスを配置する必要があります。

この種の構造を管理するには、他にどのようなオプションが必要ですか?

4

1 に答える 1

0

エンティティの継承を使用する代わりに、デリゲート デザイン パターンを使用することになりました。共通のインターフェイスを実装しContent、結合されたコンテンツ エンティティに機能を委譲します。BaseContentBaseContent

これで、この BaseContent のすべてのサブクラスが結合された Content エンティティを持ち、IContent が必要な場所で使用できるようになります。

interface IContent {...}

/**
 * @ORM\Entity
 * @ORM\Table(name="CMS_content")
 */
class Content implements IContent {
    /**
     * @ORM\ManyToOne(targetEntity="BaseContent")
     * @ORM\JoinColumn(name="parent", referencedColumnName="id", unique=false)
     */
    protected $parent;

    /**
     * @ORM\ManyToOne(targetEntity="ContentType")
     * @ORM\JoinColumn(name="content_type", referencedColumnName="id", unique=false)
     */
    protected $contentType;
    ...
};

/**
 * @ORM\Entity
 * @ORM\Table(name="CMS_whateverSpecializedContent")
 */
class WhateverSpecializedContent extends BaseContent {};

/**
 * @ORM\MappedSuperclass
 */
abstract class BaseContent implements IContent {
    /**
     * @ORM\OneToOne(targetEntity="Content", cascade={"persist", "merge", "remove"})
     * @ORM\JoinColumn(name="content", referencedColumnName="id", unique=false)
     */
    private $content;

    public function implementedMethod() {
        $this->content->implementedMethod();
    }
};
于 2013-10-28T19:54:17.623 に答える