表已经存在

时间:2013-08-20 17:45:14

标签: doctrine-orm zend-framework2

我在zend框架2中使用了doctrine 2.下面是我的实体文件。问题是,当我尝试使用时验证模式,

./vendor/bin/doctrine-module orm:validate-schema

命令。

我收到错误,

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

我该怎么办?

namespace Administration\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * OpportunityCriteria
 *
 * @ORM\Table(name="OpportunityCriteria")
 * @ORM\Entity
 */
class Criteria
{
/**
 * @var integer
 * @ORM\Id
 * @ORM\Column(name="criteria_id", type="integer", nullable=false)
 */
private $criteria_id;

/**
 * @var string
 *
 * @ORM\Column(name="description", type="string", nullable=false)
 */
private $description;
}

和适当的getter和setter方法..

2 个答案:

答案 0 :(得分:15)

我终于明白了。 OP的用例可能有所不同,但就我而言,这是因为双向多对多关系配置错误。

我有以下实体:

class Cuisine {
    /**
     * @ManyToMany(targetEntity="Dish")
     * @ORM\JoinTable(name="CuisineDish", ...)
     */
    protected $dishes;
}

class Dish {
    /**
     * @ORM\ManyToMany(targetEntity="Cuisine")
     * @ORM\JoinTable(name="CuisineDish", ...)
     */
    protected $cuisines;
}

缺少的是inversedBy注释的mappedBy@ManyToMany属性。只有在关联是双向的时才需要这些。

所以现在正确映射的实体看起来像:

class Cuisine {
    /**
     * @ManyToMany(targetEntity="Dish", inversedBy="cuisines")
     * @ORM\JoinTable(name="CuisineDish", )
     */
    protected $dishes;
}

class Dish {
    /**
     * @ORM\ManyToMany(targetEntity="Cuisine", mappedBy="dishes")
     * @ORM\JoinTable(name="CuisineDish", ...)
     */
    protected $cuisines;
}

并且orm:validate-schema不会再以异常退出。

异常消息只是误导,因为此操作不会更改数据库。此外,仅在验证与数据库的同步时才会发现此问题,而不是在仅验证映射(--skip-sync)时应该发现此问题。

我只是reported this bug

答案 1 :(得分:0)

如果要使用已安装的软件包已使用的表名,则可能会导致出现此错误消息。