2012-05-01 14 views
6

私は、Symfony 2フレームワークで構築されたDoctrine 2を使用して、データベースの継承に関する以下の問題の解決策を探しています。これは私が抽象クラスHodinyと同じインタフェースを持つ2つのテーブル(UredniHodiny、KonzultacniHodiny)を作成したい...私は何をしたいのかSymfony 2 + Doctrine 2 +継承​​

enter image description here

です。これは私がphp app/console doctrine:generate:entities CvutPWTImportBundle symfonyは両方の子クラスにプライベート変数としてクラスHodinyからすべての変数(より正確には列)を生成し実行したときに、私は今それを

<?php 

// src/CvutPWT/ImportBundle/Entity/Hodiny.php 
namespace CvutPWT\ImportBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\MappedSuperclass 
*/ 
abstract class Hodiny 
{ 

    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @ORM\ManyToOne(targetEntity="Osoba") 
    */ 
    protected $osoba; 

    /** 
    * @ORM\ManyToOne(targetEntity="Mistnost") 
    */ 
    protected $mistnost; 

    /** 
    * @ORM\Column(type="datetime") 
    */ 
    protected $zacatek; 

    /** 
    * @ORM\Column(type="datetime") 
    */ 
    protected $konec; 

} 


<?php 

// src/CvutPWT/ImportBundle/Entity/KonzultacniHodiny.php 
namespace CvutPWT\ImportBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="konzultacnihodiny") 
*/ 
class KonzultacniHodiny extends Hodiny 
{ 

} 

<?php 

// src/CvutPWT/ImportBundle/Entity/UredniHodiny.php 
namespace CvutPWT\ImportBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="urednihodiny") 
*/ 
class UredniHodiny extends Hodiny 
{ 

} 

をやろうとしている方法です。今私がapp/console doctrine:schema:update --forceでこれらのテーブルを作成しようとしているときに、エラーが発生しています。$id must be protected or weaker。この保護を手動で変更すると、テーブルを作成できますが、列(ID)は1つだけです。しかし、これは私が望んでいたものではありません。誰かが私に間違ってやっているアドバイスをくれますか?

+0

ねえ、これは私の期待どおりに動作します。私は 'konzultacnihodiny'というテーブルと' urednihodiny'というテーブルを得て、どちらも5つのフィールドを含んでいます。 注意HodinyベースクラスのFKであるため、2つのエンティティも追加する必要がありました。 また、使用する[継承タイプ](http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/inheritance-mapping.html)も確認する必要があります複数あるからです。 – Shane

答えて

8

これはテーブルの継承ではありません。マップされたスーパークラスは継承をマッピングするだけです。 最終的なエンティティに対応するテーブルは、決して頼りになりません。あなたが本当のテーブル継承(単一のテーブルまたは結合テーブルを)したい場合は

、これを使用する:http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/inheritance-mapping.html#single-table-inheritance

あなたがまだマッピングされたスーパークラスを使用する場合は、あなたが両方の最後のクラスで@ORM\Id定義を配置する必要があります。 ではなく、をidsをマップされたスーパークラスに入れることができます。

関連する問題