6

Symfony2フレームワークに組み込まれたDoctrine2を使用したデータベース継承に関する次の問題の解決策を探しています。これが私がやりたいことです...

ここに画像の説明を入力してください

抽象クラスHodinyと同じインターフェイスで2つのテーブル(UredniHodiny、KonzultacniHodiny)を作成したいと思います。これが私がやろうとしている方法です

<?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 
{

}

今私が実行すると、php app/console doctrine:generate:entities CvutPWTImportBundleSymfonyはクラスHodinyから両方の子クラスへのプライベート変数としてすべての変数(より正確には列)を生成します。これらのテーブルを作成しようとするとapp/console doctrine:schema:update --force、エラーが発生し$id must be protected or weakerます。この保護を手動で変更すると、テーブルを作成できますが、列(id)は1つだけです。しかし、これは私が望んでいたことではありません。誰かが私が間違っていることについて何かアドバイスをくれますか?

4

1 に答える 1

8

これはテーブルの継承ではありません。マップされたスーパークラスは、継承をマッピングするだけです。最終的なエンティティに対応するテーブルは、決して一緒に依存することはありません。

実際のテーブル継承 (単一テーブルまたは結合テーブル) が必要な場合は、これを使用します: http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/inheritance-mapping.html#single -テーブル継承

マップされたスーパー クラスを引き続き使用する場合は、@ORM\Id定義を両方の最終クラスに配置する必要があります。マップされたスーパー クラスに ID を入れることはできません。

于 2012-05-03T13:50:28.283 に答える