web-dev-qa-db-ja.com

DoctrineおよびSymfony2を使用してMySQLでテーブルを作成できません

私は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です。

27
Anu

同様の問題がありました。ほとんどの場合、異なるバンドル内にCategoryという名前の2つのエンティティがあります。例えば:

src/Acme/SomeBundle/Entity/Product.php
src/Acme/OtherBundle/Entity/Product.php

これらのファイルの1つをコメントにして、コンソールコマンドを再試行してください。

47

この問題は、関連クラスアノテーションで定義された結合テーブルと、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;
}
10
Onshop

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

    [...]

確かにそれはばかげたエラーです、とにかく私は共有します。

4
sglessard

できれば、これは私のために働いたのでこれを行うことができます:

データベース全体を削除します。

app/console doctrine:schema:drop --force --full-database

すべてのDB移行を実行します。

app/console doctrine:migrations:migrate

1
crmpicco

エンティティをコピーするときにかなり頻繁に発生する可能性があると思います。私の場合、残念ながら複製されたのはORMテーブル名の注釈でした。

/**
 * @ORM\Entity()
 * @ORM\Table(name="category")
 * */
class Category {
1
PiotrC

私はOne-To-Many、Unidirectional with Join Table関係( see doctrine doc )でこの問題がありました。私はインターネットまたはスタックオーバーフローを介してこの関係タイプでこのエラーケースを見つけられなかったので、同じ問題を持つ他の人を助けるための解決策をここに投稿します。

この問題の原因:

  1. ORMを使用してレガシーdbテーブルをリバースエンジニアリングした後( ドキュメント「既存のデータベースからエンティティを生成する方法」 を参照)、すべてのテーブルテーブルも結合のみを受信エンティティPHPクラス。
  2. カテゴリエンティティの注釈を使用して、結合について説明しました。このコードの結果:
/**
 * @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;
  1. @ORM\JoinTable(name="category_child"が原因で、doctrineがこのテーブルを再度作成しようとしています。すでに存在するCategory_Childエンティティと、同じテーブルを指す@ORM\JoinTable式のため、1回限りです。

解決

解決策は、リバースエンジニアリングから作成されたCategory_Childエンティティを削除することでした。 $ emクエリでCategory_Childエンティティを使用した場合は、これらのデータを別に選択する必要があります。例えば。 ArrayCollectionでこれらの子データを保持する親を介して、またはDBALを介して。

0
Fabian Picone