6

我正在寻找使用 Symfony 2 框架中内置的 Doctrine 2 来解决以下数据库继承问题的解决方案。这就是我想做的...

在此处输入图像描述

我想创建两个与抽象类 Hodiny 具有相同接口的表(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)。但这不是我所希望的。有人可以给我任何建议我做错了什么吗?

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 回答