表已经存在

use*_*791 23 doctrine-orm zend-framework2

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

./vendor/bin/doctrine-module orm:validate-schema
Run Code Online (Sandbox Code Playgroud)

命令.

我收到了错误,

[Doctrine\DBAL\Schema\SchemaException]                               
The table with name 'database.opportunitycriteria' already exists.
Run Code Online (Sandbox Code Playgroud)

我该怎么办?

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;
}
Run Code Online (Sandbox Code Playgroud)

和适当的getter和setter方法..

Ben*_*min 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;
}
Run Code Online (Sandbox Code Playgroud)

缺少的是注释的属性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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

我刚刚报告了这个错误.