Symfony2:字段或标识符列映射中实体上列'id'的重复定义

时间:2013-10-16 16:38:42

标签: php symfony doctrine-orm

我在Symfony2中使用实体继承时遇到问题。这是我的两个班级:

use Doctrine\ORM\Mapping as ORM;

/**
 * @Orm\MappedSuperclass
 */
class Object
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;
}


/**
  * @Orm\MappedSuperclass
 */
class Book extends Object
{
}

当我运行 php app / console doctrine:schema:create 时,我收到以下错误:

[Doctrine\ORM\Mapping\MappingException]  
Duplicate definition of column 'id' on entity 'Name\SiteBundle\Entity\Book' in a field or discriminator column mapping.

可能导致这种情况的原因是什么?

谢谢:)

更新

你是对的我错过了这个。现在我使用单表继承,两个类都是实体:

/**
 * @Entity
 * @InheritanceType("SINGLE_TABLE")
 * @DiscriminatorColumn(name="discr", type="string")
 * @DiscriminatorMap({"object" = "Object", "book" = "Book"})
 */

但我仍然收到相同的错误消息。

7 个答案:

答案 0 :(得分:8)

实际上我在Resources / config / doctrine /中找到了yml文件,它们定义了我的实体,而不仅仅是使用注释。

我删除了这些文件,现在正在使用。

感谢您的帮助!

答案 1 :(得分:2)

即使在向yml文件添加定义后,我也遇到了同样的问题。我试图增加重量和一个班级的最大重量并且正在获得:

Duplicate definition of column 'weight_value' on entity 'Model\ClientSuppliedProduct' in a field or discriminator column mapping.

然后我意识到要求columnPrefix对于相似类型的字段有所不同,并在yml中添加以下内容为我解决了这个问题:

`maxWeight:`
  `class: Model\Weight`
  `columnPrefix: max_weight_`

答案 2 :(得分:2)

我有同样的问题和错误信息,但对我来说,这是另一种方式@ user2090861说。

我不得不删除(未使用的)

use Doctrine\ORM\Mapping as ORM;

来自我的实体文件,因为我的真实映射来自orm.xml文件。

我希望我能帮助许多其他人的答案,因为这个例外在过去的两天里让我发疯了!

答案 3 :(得分:1)

有时无法删除额外的配置文件,因为它们位于第三方软件包中并且auto_mapping已启用。

在这种情况下,您应该在app/config.yml

中禁用不需要的映射
doctrine:
orm:
    entity_managers:
        default:
            mappings:
                SonataMediaBundle: { mapping: false }

答案 4 :(得分:0)

任何实体必须至少包含一个字段。

您必须在图书实体

中添加至少一个字段

示例

/**
 * @Orm\MappedSuperclass
*/
class Book extends Object
{
 /**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
  private $id;
}

答案 5 :(得分:0)

我有同样的错误信息,但我犯了一个不同的错误:

B类有一个ID和扩展的A类,它也有一个ID(受保护,而不是私有)。所以我不得不从B类中删除ID。

答案 6 :(得分:0)

我在另一个上下文中遇到了这种情况-在我的情况下,我已经使用@ORM\DiscriminatorColumn为单表继承设置了一个实体,但也将该列包括在我的类定义中:

/**
 * @ORM\Entity(repositoryClass="App\Repository\DirectoryObjectRepository")
 * @ORM\InheritanceType("SINGLE_TABLE")
 * @ORM\DiscriminatorColumn(name="kind", type="string")
 */
class DirectoryObject {
    // ...
    /**
     * @ORM\Column(type="string", length=255)
     */
    private $kind;
}

删除@ORM\Column的{​​{1}}定义可以解决此问题,因为Doctrine为我定义了它。