我正在使用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。
答案 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找到这种关系类型的错误情况,所以我在这里发布我的解决方案,让其他人解决同样的问题。
是什么导致了这个问题:
/**
* @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;
@ORM\JoinTable(name="category_child"
导致该学说再次创建此表。有一次是因为已经存在的Category_Child实体,然后是指向同一个表的@ORM\JoinTable
表达式。解决方案是删除从逆向工程创建的Category_Child实体。如果您在某些$ em查询中使用了Category_Child实体,则必须选择这些数据。例如。通过在ArrayCollection或DBAL中保存这些子数据的父级。