Подтвердить что ты не робот

Не удалось создать таблицу в 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.

4b9b3361

Ответ 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;
  1. @ORM\JoinTable(name="category_child" заставил эту доктрину снова хотеть создать эту таблицу. Один раз из-за уже существующего объекта Category_Child, а затем выражение @ORM\JoinTable, которое указывает на ту же таблицу.

Решение

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