web-dev-qa-db-fra.com

Impossible de créer une table dans MySQL avec Doctrine et Symfony2

Je travaille avec Symfony2 et Doctrine ORM en utilisant MySql.

Après avoir créé une entité, je ne peux pas créer la table. Il jette une exception.

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[="..."]]

J'ai essayé de le laisser tomber, mais il jette toujours l'erreur.

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.

Il n'y a pas de tables dans la base de données. Efface tout le cache pour Symfony et la doctrine, mais l'erreur est toujours là.

La version de Symfony2 est 2.0.1. 

27
Anu

J'ai eu un problème similaire. Très probablement, vous avez deux entités nommées Catégorie dans des ensembles différents. Par exemple:

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

Commentez l'un de ces fichiers et relancez la commande de la console.

47
Federico Cristina

J'obtenais ce problème d'un conflit avec la table de jointure définie dans une annotation de classe d'association et une table de jointure définie dans une annotation ManyToMany.

Les définitions de mappage dans deux entités avec une relation directe ManytoMany ont apparemment abouti à la création automatique de la table de jointure à l'aide de l'annotation 'joinTable'. Cependant, la table de jointure était déjà définie par une annotation dans sa classe d'entité sous-jacente et je souhaitais qu'elle utilise les propres définitions de champ de cette classe d'entité d'association afin d'étendre la table de jointure avec des champs personnalisés supplémentaires.

L'explication et la solution ont été obtenues grâce à ce message du forum ' Doctrine Annotation Question '. Cet article attire l’attention sur la documentation de Doctrine concernant Les relations unidirectionnelles entre ManyToMany . Observez la note concernant l'approche consistant à utiliser une «classe d'entités d'association», remplaçant ainsi le mappage d'annotations plusieurs à plusieurs directement entre deux classes d'entités principales par une annotation un à plusieurs dans les classes d'entités principales et deux -one 'annotations dans la classe d'entité associative. Un exemple est fourni dans cet article de forum Modèles d'association avec des champs supplémentaires :

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
Ben

J'ai eu cette erreur lors de l'édition de mon fichier Product.orm.yml.

J'ai ajouté une nouvelle relation manyToMany avec une entité Category et j'ai commis une erreur sur la ligne joinTable:

manyToMany:
  categories:
    targetEntity: Acme\ProductBundle\Entity\Category
    inversedBy: products
    joinTable:
      name: Product  # My mistake: joinTable should be something like ProductCategory

    [...]

En effet c'est une erreur stupide, je partage quand même.

4
sglessard

Si vous le pouvez, vous pouvez le faire car cela a fonctionné pour moi:

Supprimer la base de données entière:

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

Exécutez toutes les migrations de base de données:

app/console doctrine:migrations:migrate

1
crmpicco

J'imagine que cela peut arriver assez souvent lors de la copie d'entités. Dans mon cas, il s'agissait d'une annotation de nom de table ORM qui avait été dupliquée par erreur.

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

J'ai eu ce problème avec une relation One-To-Many, Unidirectional avec Join Table comme ( voir doctrine doc ). Je n'ai pas trouvé ce cas d'erreur avec ce type de relation via Internet ou stackoverflow, aussi je poste ici ma solution pour laisser aider les autres avec le même problème.

Quelle est la cause de ce problème:

  1. Après le reverse engineering des tables de base de données héritées avec ORM ( voir la documentation "Comment générer des entités à partir d'une base de données existante" ), toutes les tables rejoignent également les tables ont reçu une classe d'entité PHP.
  2. Avec des annotations sur une entité de catégorie, j’ai décrit la jonction. Résultats ce code:
/**
 * @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. Le @ORM\JoinTable(name="category_child" a causé cette doctrine veut créer à nouveau cette table. Une fois en raison de l'entité Category_Child existante, puis de l'expression @ORM\JoinTable qui pointe vers la même table.

Solution

La solution consistait à supprimer l'entité Category_Child créée à partir du reverse engineering. Si vous avez utilisé l'entité Category_Child dans certaines requêtes $ em, vous devez sélectionner ces données autrement. Par exemple. Via le parent qui contient ces données enfants dans un ArrayCollection ou via DBAL.

0
Fabian Picone