2013-08-20 41 views
21

我在zend framework 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方法..

+0

是否有類名爲OpportunityCriteria的實體類? –

+7

從外觀上看,這僅僅意味着在一些實體類中,該行重複多次1次@ORM \ Table(name =「OpportunityCriteria」) 現在這種類型的錯誤通常發生在我們通過複製/粘貼代碼時 –

+0

I遇到這個錯誤並且搜索@ORM \ Table的實體目錄時,只會顯示出所討論表名的一個出現。 (這種類型的錯誤通常發生在你假設的事情上。) – Scott

回答

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; 
} 

少了什麼是@ManyToMany註釋的inversedBymappedBy性能。這些僅在關聯是雙向時才需要。

所以現在正確映射實體的樣子:

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

0

如果您想使用其中一個已安裝軟件包已使用的表名,則可能會導致此錯誤消息。