2013-08-20 9 views
21

私は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メソッド..

+0

クラスがありますOpportunityCriteriaという名前のエンティティクラスですか? –

+7

これは単にエンティティクラスの中には、この行が@ORM \ Table(name = "OpportunityCriteria")よりも1回多く繰り返されていることを意味しています。 このタイプの間違いは通常、コピー/ペーストによるコード –

+0

ですこのエラーが発生し、@ORM \ Tableのエンティティディレクトリの検索を行うと、問題のテーブルの名前に対して1つのオカレンスしか表示されません。 (この種の間違いは通常、物事を引き受けるときに起こります) – 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

既にインストールされているバンドルのいずれかで使用されているテーブル名を使用する場合は、このエラーメッセージが表示されることがあります。

関連する問題