【问题标题】:Symfony2: Duplicate definition of column 'id' on entity in a field or discriminator column mappingSymfony2:字段或鉴别器列映射中实体上列“id”的重复定义
【发布时间】:2013-10-16 16:38:41
【问题描述】:

我在 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 dictionary: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"})
 */

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

【问题讨论】:

标签: php symfony doctrine-orm


【解决方案1】:

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

我删除了这些文件,它现在可以工作了。

感谢您的帮助!

【讨论】:

  • 你的回答对我也有帮助! :) Symfony 3.1 FOSUser Bundle。
【解决方案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_`

【讨论】:

    【解决方案3】:

    我遇到了同样的问题和错误消息,但对我来说,正如@user2090861 所说的那样。

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

    use Doctrine\ORM\Mapping as ORM;
    

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

    我希望我的回答可以帮助很多其他人,因为最近两天这个异常让我发疯了!

    【讨论】:

      【解决方案4】:

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

      在这种情况下,您应该禁用 app/config.yml 中不需要的映射

      doctrine:
      orm:
          entity_managers:
              default:
                  mappings:
                      SonataMediaBundle: { mapping: false }
      

      【讨论】:

        【解决方案5】:

        我在不同的上下文中遇到了这个问题 - 在我的例子中,我使用 @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;
        }
        
        

        删除 kind@ORM\Column 定义解决了这个问题,正如 Doctrine 为我定义的那样。

        【讨论】:

          【解决方案6】:

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

          您必须在图书实体中添加至少一个字段

          示例

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

          【讨论】:

            【解决方案7】:

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2014-02-12
              • 2019-02-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-08-13
              相关资源
              最近更新 更多