无法使用Doctrine和Symfony2在MySQL中创建表

时间:2011-09-27 07:18:46

标签: mysql symfony doctrine-orm

我正在使用MySql使用Symfony2和Doctrine ORM。

创建实体后,我无法创建表格。它抛出异常。

anu@anu-bridge:/var/www/Symfony$ php app/console doctrine:schema:update --force --dump-sql

[Doctrine\DBAL\Schema\SchemaException]
The table with name 'product' already exists.  

doctrine:schema:update [--complete] [--dump-sql] [--force] [--em[="..."]]

我试图放弃它,但仍然会抛出错误。

anu@anu-bridge:/var/www/Symfony$ php app/console doctrine:schema:drop --force
Dropping database schema...

[Doctrine\DBAL\Schema\SchemaException]         
The table with name 'product' already exists.  

doctrine:schema:drop [--dump-sql] [--force] [--full-database] [--em[="..."]]

[Doctrine\DBAL\Schema\SchemaException]         
The table with name 'product' already exists.

数据库中没有表格。清除了symfony和doctrine的所有缓存,但仍然是错误抛出。

Symfony2版本是2.0.1。

6 个答案:

答案 0 :(得分:47)

我遇到了类似的问题。很可能你在不同的Bundles中有两个名为Category的实体。例如:

src/Acme/SomeBundle/Entity/Product.php
src/Acme/OtherBundle/Entity/Product.php

评论其中一个文件并重试控制台命令。

答案 1 :(得分:10)

我从与关联类注释中定义的连接表和ManyToMany注释中定义的连接表的冲突中得到此问题。

具有直接ManytoMany关系的两个实体中的映射定义似乎导致使用'joinTable'注释自动创建连接表。但是,连接表已经在其底层实体类中由注释定义,我希望它使用此关联实体类自己的字段定义,以便使用其他自定义字段扩展连接表。

解释和解决方案归功于论坛“Doctrine Annotation Question”中的这篇文章。这篇文章提请注意关于ManyToMany Uni-directional relationships的Doctrine文档。查看关于使用“关联实体类”的方法的注释,从而直接在两个主要实体类之间替换多对多注释映射,在主要实体类中使用一对多注释和两个“多 - 到” - 关联实体类中的一个'注释。此论坛帖子Association models with extra fields中提供了一个示例:

public class Person
{
    /** 
     * @OneToMany(targetEntity="AssignedItems", mappedBy="person")
     */
    private $assignedItems;
}

public class Items
{
    /**
     * @OneToMany(targetEntity="AssignedItems", mappedBy="item")
     */
    private $assignedPeople;
}

public class AssignedItems
{
    /** 
     * @ManyToOne(targetEntity="Person")
     * @JoinColumn(name="person_id", referencedColumnName="id")
     */
    private $person;

    /** 
     * @ManyToOne(targetEntity="Item")
     * @JoinColumn(name="item_id", referencedColumnName="id")
     */
    private $item;
}

答案 2 :(得分:4)

编辑Product.orm.yml文件时出现此错误。

我在Category实体中添加了一个新的manyToMany关系,并在joinTable行上出错:

manyToMany:
  categories:
    targetEntity: Acme\ProductBundle\Entity\Category
    inversedBy: products
    joinTable:
      name: Product  # My mistake: joinTable should be something like ProductCategory

    [...]

确实这是一个愚蠢的错误,无论如何我都会分享。

答案 3 :(得分:1)

如果可以,你可以这样做,因为这对我有用:

删除整个数据库:

app/console doctrine:schema:drop --force --full-database

运行所有数据库迁移:

app/console doctrine:migrations:migrate

答案 4 :(得分:1)

我想在复制实体时经常会发生这种情况。在我的例子中,它是一个不幸重复的ORM表名注释。

/**
 * @ORM\Entity()
 * @ORM\Table(name="category")
 * */
class Category {

答案 5 :(得分:0)

我遇到了这个问题,其中一对多,单向与联接表关系如(see doctrine doc)。我没有通过互联网或stackoverflow找到这种关系类型的错误情况,所以我在这里发布我的解决方案,让其他人解决同样的问题。

是什么导致了这个问题:

  1. 使用ORM(see doc "How to Generate Entities from an Existing Database")对遗留数据库表进行逆向工程后,所有表也仅连接表收到实体PHP类。
  2. 通过对类别实体的注释,我描述了加入。结果这段代码:
  3. /**
     * @ORM\ManyToMany(targetEntity="Category")
     * @ORM\JoinTable(name="category_child",
     *     joinColumns={@JoinColumn(name="category_id", referencedColumnName="id")},
     *     inverseJoinColumns={@JoinColumn(name="category_child_id", referencedColumnName="id")}
     * )
     */
    public $children;
    
    1. @ORM\JoinTable(name="category_child"导致该学说再次创建此表。有一次是因为已经存在的Category_Child实体,然后是指向同一个表的@ORM\JoinTable表达式。
    2. 解决方案

      解决方案是删除从逆向工程创建的Category_Child实体。如果您在某些$ em查询中使用了Category_Child实体,则必须选择这些数据。例如。通过在ArrayCollection或DBAL中保存这些子数据的父级。