どの種類の Doctrine 継承が自分のプロジェクトに適しているかを判断するのに苦労しています。
目標は、仮想マシン (VM) に複数のソフトウェア (PHP、MySQL など...) を持たせることです。
これらの各ソフトウェアには、明確なクラスがあり、いくつかの共通フィールドがあります。最初に VM クラスに各ソフトウェア クラスとの関係を入れてみましたが、見事に機能しました。
/**
* Class VM
*/
class VM
{
/**
* @var \AppBundle\Entity\MySQL
*
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\MySQL", cascade={"persist"})
*
*/
private $mysql;
/**
* @var \AppBundle\Entity\PHP
*
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\PHP", cascade={"persist"})
*
*/
private $php;
...
and other softwares, always the same
}
しかし今、すべてのソフトウェアが継承する抽象クラス「ソフトウェア」を使用し、VM クラスに $software 属性のみを持たせたいと考えています。このようにして、将来、Software から継承する新しいソフトウェア クラスを簡単に追加できます。
仮想マシン (VM) クラスにリンクされた私の抽象クラス「ソフトウェア」:
/**
* Class Software
*/
abstract class Software {
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="version", type="string", length=255, nullable=true)
*/
private $version;
/**
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\VM")
*/
private $VM;
}
Software クラスに注釈を付けようとしました@ORM\SuperMappedClass
が、子クラスにアクセスする方法が見つかりませんでした。これは、この特定のケースに最適なドクトリンの継承ですか? 具体的なテーブルの継承はより良い選択でしょうか? ドキュメントで詳しく説明されていないため、具体的な継承が可能かどうかさえわかりません。