Не удалось создать таблицу в MySQL с помощью Doctrine и Symfony2
Я работаю с Symfony2 и Doctrine ORM с помощью MySql.
После создания Entity я не могу создать таблицу. Это исключает.
[email protected]:/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[="..."]]
Я попытался сбросить его, но все же он выдает ошибку.
[email protected]:/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.
Ответы
Ответ 1
У меня была аналогичная проблема. Скорее всего, у вас есть два объекта с именем Категория внутри разных Связок. Например:
src/Acme/SomeBundle/Entity/Product.php
src/Acme/OtherBundle/Entity/Product.php
Прокомментировать один из этих файлов и повторить консольную команду.
Ответ 2
Я получал эту проблему из конфликта с таблицей соединений, определенной в аннотации класса ассоциации, и таблицей соединений, определенной в аннотации ManyToMany.
Определения сопоставления в двух объектах с прямым отношением ManytoMany привели к автоматическому созданию таблицы соединений с использованием аннотации "joinTable". Однако таблица соединений уже была определена аннотацией в своем базовом классе сущностей, и я хотел, чтобы он использовал собственные определения полей класса ассоциации, чтобы расширить таблицу соединений с дополнительными настраиваемыми полями.
Объяснение и решение было благодаря этой записи в форуме Вопрос аннотации доктрины. В этом сообщении обращается внимание на документацию Doctrine, касающуюся Многопользовательских однонаправленных отношений. Посмотрите на примечание относительно подхода использования "класса сущности ассоциации", таким образом, заменив сопоставление аннотаций "многие-ко-многим" непосредственно между двумя основными классами сущностей с аннотацией "один-ко-многим" в основных классах сущностей и двумя "много- -one 'в классе ассоциативной сущности. На этом форуме представлен пример Модели с дополнительными полями:
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;
}
Ответ 3
Я получил эту ошибку при редактировании файла 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
[...]
Действительно, это глупая ошибка, я все равно разделяю.
Ответ 4
Если вы можете, вы можете сделать это, поскольку это сработало для меня:
Отбросьте всю базу данных:
app/console doctrine:schema:drop --force --full-database
Запустите все миграции DB:
app/console doctrine:migrations:migrate
Ответ 5
Я предполагаю, что это может произойти довольно часто при копировании сущностей. В моем случае это была аннотация с именем таблицы ORM, которая была неправильно воспроизведена.
/**
* @ORM\Entity()
* @ORM\Table(name="category")
* */
class Category {
Ответ 6
У меня была эта проблема с отношением Одностороннее, однонаправленное с объединенной таблицей, вроде (см. доктрину doc). Я не нашел этот случай ошибки с этим типом отношения через интернет или stackoverflow, поэтому я размещаю здесь мое решение, чтобы помочь другим с той же проблемой.
Что вызвало эту проблему:
/**
* @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"
заставил эту доктрину снова хотеть создать эту таблицу. Один раз из-за уже существующего объекта Category_Child, а затем выражение @ORM\JoinTable
, которое указывает на ту же таблицу.
Решение
Решение заключалось в удалении объекта Category_Child, который был создан из обратной инженерии. Если вы использовали объект Category_Child в некоторых $em-запросах, вы должны выбрать эти данные в противном случае. Например. Через родительский объект, который содержит эти дочерние данные в ArrayCollection или над DBAL.