Невозможно создать таблицу в MySQL, используя Doctrine и Symfony2 - PullRequest
27 голосов
/ 27 сентября 2011

Я работаю с Symfony2 и Doctrine ORM, используя 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 и доктрины, но все равно выкидывает ошибка.

Версия Symfony2 - 2.0.1.

Ответы [ 6 ]

47 голосов
/ 24 ноября 2011

У меня была похожая проблема. Скорее всего, у вас есть две сущности с именем Category внутри разных комплектов. Например:

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

Прокомментируйте один из этих файлов и повторите команду консоли.

10 голосов
/ 03 октября 2013

Эта проблема возникла из-за конфликта с таблицей соединений, определенной в аннотации класса ассоциации, и таблицей соединений, определенной в аннотации ManyToMany.

Определения сопоставления в двух объектах с прямым отношением ManytoMany, по-видимому, привели к автоматическому созданию таблицы объединения с использованием аннотации joinTable. Однако таблица соединения уже была определена аннотацией в базовом классе сущности, и я хотел, чтобы она использовала собственные определения полей этого класса сущности ассоциации, чтобы расширить таблицу соединения дополнительными настраиваемыми полями.

Объяснение и решение было благодаря этому сообщению на форуме ' Doctrine Annotation Question '. Этот пост привлекает внимание к документации Доктрины, касающейся однонаправленных связей ManyToMany . Посмотрите на примечание, касающееся подхода использования «класса сущностей ассоциации», таким образом заменяя отображение аннотации «многие ко многим» непосредственно между двумя основными классами сущностей аннотацией «один ко многим» в основных классах сущностей и двумя «многими к» -одно »аннотации в классе« Ассоциативная сущность ». В этом сообщении на форуме есть пример Ассоциация моделей с дополнительными полями :

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;
}
4 голосов
/ 16 мая 2012

Я получил эту ошибку при редактировании моего файла Product.orm.yml.

Я добавил новое отношение manyToMany с сущностью Category и допустил ошибку в строке joinTable:

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

    [...]

Действительно, это глупая ошибка, я все равно поделюсь.

1 голос
/ 18 мая 2016

Я полагаю, это может происходить довольно часто при копировании объектов.В моем случае это была аннотация имени таблицы ORM, которая, к сожалению, была дублирована.

/**
 * @ORM\Entity()
 * @ORM\Table(name="category")
 * */
class Category {
1 голос
/ 02 декабря 2014

Если вы можете, вы можете сделать это так, как это работает для меня:

Удалить всю базу данных:

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

Запустить все миграции БД:

app/console doctrine:migrations:migrate

0 голосов
/ 22 сентября 2015

У меня была эта проблема с отношением «Один ко многим», однонаправленным с таблицей соединений , например ( см. Doctrine Doc ). Я не нашел такого случая ошибки с этим типом отношения через Интернет или через стековый поток, поэтому я опубликую здесь свое решение, чтобы помочь другим с такой же проблемой.

Что вызвало эту проблему:

  1. После обратного инжиниринга устаревших таблиц БД с ORM ( см. Документ "Как создавать объекты из существующей базы данных" ), все таблицы также только объединяют таблицы , получивший объектный класс 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" вызвало то, что доктрина хочет снова создать эту таблицу. Один раз из-за уже существующей сущности Category_Child, а затем выражения @ORM\JoinTable, которое указывает на ту же таблицу.

Решение

Решением было удаление сущности Category_Child, которая была создана из реверс-инжиниринга. Если вы использовали сущность Category_Child в некоторых запросах $ em, вы должны выбрать эти данные в обратном направлении. Например. Через родителя, который хранит эти дочерние данные в ArrayCollection, или через DBAL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...