25

我在 zend 框架 2 中使用学说 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方法..

4

2 回答 2

17

我终于弄明白了。OP 的用例可能不同,但在我的情况下,这是因为配置错误的双向多对多关系。

我有以下实体:

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

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

缺少的是注释的inversedBymappedBy属性。@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) 时才发现。

我刚刚报告了这个错误

于 2015-10-24T20:11:38.263 回答
1

如果您想使用已由其中一个已安装的捆绑包使用的表名,则可能会导致此错误消息。

于 2017-11-05T18:01:13.653 回答