2013-11-11 4 views
8

У меня есть странная проблема: У меня есть Symfony приложения 2,3 (с пользователем сонаты) Я создал пакет с одним объектом - сущность была создана без проблем тогда я должен был изменить сущность и теперь, кажется, невозможно изменить схему:Symfony доктрина: схема: обновление не работает

чтобы понять, что происходит, я увеличил все длины строки с +1

код объект (с аннотациями):

namespace Too\ConfigAppBundle\Entity; 

use Gedmo\Mapping\Annotation as Gedmo; 
use Doctrine\ORM\Mapping as ORM; 

/** 
* ConfigApp 
* 
* @ORM\Table(name="ConfigApp") 
* @ORM\Entity(repositoryClass="Too\ConfigAppBundle\Entity\ActiviteRepository") 
*/ 
class ConfigApp 
{ 
    /** 
    * @var integer $id 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string $nom 
    * 
    * @ORM\Column(name="nom", type="string", length=101, unique=true) 
    */ 
    private $nom; 

    /** 
    * @var string $nomSlug 
    * 
    * @Gedmo\Slug(fields={"nom"}, updatable=true, separator="_") 
    * @ORM\Column(name="nomSlug", type="string", length=101, nullable=true) 
    */ 
    private $nomSlug; 

    /** 
    * @var string $email 
    * 
    * @ORM\Column(name="email", type="string", length=151) 
    */ 
    private $email; 

    /** 
    * @var string $telephone 
    * 
    * @ORM\Column(name="telephone", type="string", length=16) 
    */ 
    private $telephone; 

    /** 
    * @var datetime $cree_le 
    * 
    * @Gedmo\Timestampable(on="create") 
    * @ORM\Column(name="cree_le", type="datetime") 
    */ 
    private $cree_le; 

    /** 
    * @var datetime $modifie_le 
    * 
    * @Gedmo\Timestampable(on="update") 
    * @ORM\Column(name="modifie_le", type="datetime") 
    */ 
    private $modifie_le; 

    ... 

Теперь посмотрим результат:

php app/console doctrine:schema:update --dump-sql 

CREATE TABLE ConfigApp (id INT AUTO_INCREMENT NOT NULL, nom VARCHAR(100) NOT NULL, nomSlug VARCHAR(100) NOT NULL, email VARCHAR(150) NOT NULL, telephone VARCHAR(15) NOT NULL, cree_le DATETIME NOT NULL, modifie_le DATETIME NOT NULL, PRIMARYKEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB 

Ни новой длины не принимается во внимание: , например, поле псевдоним должен иметь длину = 101, но дамп-SQL дает ном VARCHAR (100)!

Может ли кто-нибудь попытаться выяснить, что происходит не так? Спасибо!

EDIT: Я пытался, прежде чем очистить кэш с: * PHP приложения/консолью доктрина: кэш: ясно-метаданные * PHP приложение/кэш консоли: ясно *, удалив все содержимое папки кэша

Я также пробовал --dump-sql и -force.

Это ничего не меняет. Пожалуйста, подскажите пожалуйста!

+5

Я бы попытался очистить кеш метаданных. Я думаю, что это 'doctrine: cache: clear-metadata'. Просто запустите 'app/console' для списка команд – Phil

ответ

-1

Попробуйте

php app/console doctrine:schema:update --force 

это обновление схемы базы данных с объектом

+0

Это не поможет, так как он сбрасывает ту же самую информацию, что и --dump-sql – Yvan

0

Тип php app/console help doctrine:schema:update в CLI

--dump-sql   Dumps the generated SQL statements to the screen (does no 
t execute them). 

... 

--force    Causes the generated SQL statements to be physically exec 
uted against your database. 

Так попробуйте --force вместо --dump-sql.

А вот команда для очистки кэша:

php app/console cache:clear 

Не забудьте использовать help ключевое слово перед командой имен для того, чтобы получить сообщение справки для этой команды.

Надеется, что это помогает

1

Я нашел решение: я не видел раньше, но там была папка доктрины в ЦСИ \ Too \ ConfigAppBundle \ Resources \ Config, содержащий файл с именем ConfigApp.orm.yml:

Too\ConfigAppBundle\Entity\ConfigApp: 
    type: entity 
    table: null 
    repositoryClass: Too\ConfigAppBundle\Entity\ConfigAppRepository 
    fields: 
     id: 
      type: integer 
      id: true 
      generator: 
       strategy: AUTO 
     nom: 
      type: string 
      length: '100' 
     nomSlug: 
      type: string 
      length: '100' 
     email: 
      type: string 
      length: '150' 
     telephone: 
      type: string 
      length: '15' 
     cree_le: 
      type: datetime 
      length: null 
     modifie_le: 
      type: datetime 
      length: null 
    lifecycleCallbacks: { } 

Я удалил эту папку и теперь обновляю схему снова.

Наверняка я сделал что-то, чтобы создать эту папку доктрины, но я не знаю, что это было - если кто-то мог сказать мне, как этот материал генерируется - и почему?

1

Я думаю, что его beacause of doctrine: mapping: import command. Эта команда хранит схему существующей базы данных в файлы .orm.xml. Довольно успешно выполнить эту команду.

У меня была такая же проблема, берегите меня много времени, чтобы узнать.

10

Я только что закончил то же самое: схема не обновляется.

Обратите внимание, что -force возвращает точно такую ​​же вещь, как -dump-sql, единственное различие заключается в том, что -force запускает SQL по базе данных.

Хотя, в моем случае проблема была не из-за файла .orm.xml. Это потому, что я поставил это в config_dev.xml:

doctrine: 
orm: 
    metadata_cache_driver: 
     type: memcached 
     host: localhost 
     port: 11211 
     instance_class: Memcached 
    query_cache_driver: 
     type: memcached 
     host: localhost 
     port: 11211 
     instance_class: Memcached 
    result_cache_driver: 
     type: memcached 
     host: localhost 
     port: 11211 
     instance_class: Memcached 

Даже когда я выпустить часто спасительный:

php app/console cache:clear 

Memcached данные не покраснел. Поэтому мне пришлось перезапустить memcached, и все снова и снова запускалось!

Так что спасибо за ваш вопрос, он привел меня в нужное место в моем случае.

UPDATE: как это было предложено выше Фил, выполнив команду делает трюк тоже:

php app/console doctrine:cache:clear-metadata 
9

Вполне возможно, что вы забыли включить Doctrine автоматическое отображение;

orm: 
    #auto_mapping: true 

Если автоматическое сопоставление отключено (или указано как указано выше), вы должны зарегистрировать объекты каждого комплекта вручную.

orm: 
    entity_managers: 
     default: 
     mappings: 
      AcmeHelloBundle: ~ 
6

Попробуйте использовать YAML вместо аннотаций по умолчанию при запуске

php app/console doctrine:generate:entity 

Или вместо того, чтобы работать

app/console doctrine:schema:update --force 

Вы можете просто вручную создать таблицу MySql, которая является очень утомительным task

-1

Потому что я использовал .orm.yml-сопоставление. У меня была проблема, которую я создал t он doctrine -folder, в котором yml отображения присутствовали, по ложному пути, так что я установил его, перемещая doctrine -folder к config в папке: ...\BundleName\Resources\config\doctrine\MyEntity.orm.yml

+0

Может ли downvoter прокомментировать, почему вы остановили его? Конечно, это не ответ на вопрос, но я просто добавил одно возможное решение, которое кто-то мог забыть при поиске ответа ... – goulashsoup

0

Хотя некоторые из ответов на @rai и другие верны, еще одно предложение для версии Symfony равно или выше 3.0, пожалуйста, используйте bin/console вместо app/console, как показано ниже,

bin/console doctrine:schema:update --force 
Смежные вопросы