私はSymfony2とDoctrine ORM with MySqlを使用しています。
エンティティを作成した後、テーブルを作成できません。例外をスローします。
anu@anu-bridge:/var/www/Symfony$ php app/console doctrine:schema:update --force --dump-sql
[Doctrine\DBAL\Schema\SchemaException]
The table with name 'product' already exists.
doctrine:schema:update [--complete] [--dump-sql] [--force] [--em[="..."]]
ドロップしようとしましたが、それでもエラーがスローされます。
anu@anu-bridge:/var/www/Symfony$ php app/console doctrine:schema:drop --force
Dropping database schema...
[Doctrine\DBAL\Schema\SchemaException]
The table with name 'product' already exists.
doctrine:schema:drop [--dump-sql] [--force] [--full-database] [--em[="..."]]
[Doctrine\DBAL\Schema\SchemaException]
The table with name 'product' already exists.
データベースにテーブルがありません。 symfonyとdoctrineのすべてのキャッシュをクリアしましたが、それでもエラーがスローされています。
Symfony2のバージョンは2.0.1です。
同様の問題がありました。ほとんどの場合、異なるバンドル内にCategoryという名前の2つのエンティティがあります。例えば:
src/Acme/SomeBundle/Entity/Product.php
src/Acme/OtherBundle/Entity/Product.php
これらのファイルの1つをコメントにして、コンソールコマンドを再試行してください。
この問題は、関連クラスアノテーションで定義された結合テーブルと、ManyToManyアノテーションで定義された結合テーブルとの競合から発生していました。
ManytoManyの直接的な関係を持つ2つのエンティティのマッピング定義は、 'joinTable'アノテーションを使用して結合テーブルを自動的に作成するように見えました。ただし、結合テーブルは、基になるエンティティクラスの注釈によって既に定義されており、この関連付けエンティティクラスの独自のフィールド定義を使用して、追加のカスタムフィールドで結合テーブルを拡張したいと考えていました。
説明と解決策は、フォーラム ' Doctrine Annotation Question 'のこの投稿のおかげでした。この投稿は、Doctrineに関するドキュメント ManyToMany単方向リレーションシップ に注意を向けます。「関連付けエンティティクラス」を使用する方法に関するメモを参照してください。 2つのメインエンティティクラス間の直接の多対多アノテーションマッピング、メインエンティティクラスの1対多アノテーション、および関連エンティティクラスの2つの「多対1」アノテーション。このフォーラム投稿で提供されている例があります。 追加フィールドのあるアソシエーションモデル :
public class Person
{
/**
* @OneToMany(targetEntity="AssignedItems", mappedBy="person")
*/
private $assignedItems;
}
public class Items
{
/**
* @OneToMany(targetEntity="AssignedItems", mappedBy="item")
*/
private $assignedPeople;
}
public class AssignedItems
{
/**
* @ManyToOne(targetEntity="Person")
* @JoinColumn(name="person_id", referencedColumnName="id")
*/
private $person;
/**
* @ManyToOne(targetEntity="Item")
* @JoinColumn(name="item_id", referencedColumnName="id")
*/
private $item;
}
Product.orm.ymlファイルを編集すると、このエラーが発生しました。
Categoryエンティティに新しいmanyToManyリレーションを追加し、joinTable行に間違いを犯しました:
manyToMany:
categories:
targetEntity: Acme\ProductBundle\Entity\Category
inversedBy: products
joinTable:
name: Product # My mistake: joinTable should be something like ProductCategory
[...]
確かにそれはばかげたエラーです、とにかく私は共有します。
できれば、これは私のために働いたのでこれを行うことができます:
データベース全体を削除します。
app/console doctrine:schema:drop --force --full-database
すべてのDB移行を実行します。
app/console doctrine:migrations:migrate
エンティティをコピーするときにかなり頻繁に発生する可能性があると思います。私の場合、残念ながら複製されたのはORMテーブル名の注釈でした。
/**
* @ORM\Entity()
* @ORM\Table(name="category")
* */
class Category {
私はOne-To-Many、Unidirectional with Join Table関係( see doctrine doc )でこの問題がありました。私はインターネットまたはスタックオーバーフローを介してこの関係タイプでこのエラーケースを見つけられなかったので、同じ問題を持つ他の人を助けるための解決策をここに投稿します。
この問題の原因:
/**
* @ORM\ManyToMany(targetEntity="Category")
* @ORM\JoinTable(name="category_child",
* joinColumns={@JoinColumn(name="category_id", referencedColumnName="id")},
* inverseJoinColumns={@JoinColumn(name="category_child_id", referencedColumnName="id")}
* )
*/
public $children;
@ORM\JoinTable(name="category_child"
が原因で、doctrineがこのテーブルを再度作成しようとしています。すでに存在するCategory_Childエンティティと、同じテーブルを指す@ORM\JoinTable
式のため、1回限りです。解決策は、リバースエンジニアリングから作成されたCategory_Childエンティティを削除することでした。 $ emクエリでCategory_Childエンティティを使用した場合は、これらのデータを別に選択する必要があります。例えば。 ArrayCollectionでこれらの子データを保持する親を介して、またはDBALを介して。