Добавить столбец к существующей сущности в Symfony

я играл с Symfony на моем веб-сервере, и яя создаю сущность с доктриной для моей базы данных. Я хотел добавить столбец к одному из этих объектов ... Я хотел сделать что-то вроде:

php app/console doctrine:modify:entity

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

Постскриптум Я знаю, что могу открыть файл php и добавить текстовую колонку, а затем обновить схему, но яЯ распространяю это некоторым клиентам, и мне нравится большекомандная строка, как» подход.

 Ocramius18 февр. 2013 г., 18:04
Сделай это с помощью кода. Генераторные инструменты ORM не должны использоваться таким образом.

Ответы на вопрос(7)

Решение Вопроса

использование Doctrine не имеет никакого смысла делать что-то, как вы предложили.

Doctrine - это инструмент ORM (объектно-реляционное отображение). Это означает, что вы хотите абстрагировать базу данных от вашего PHP-кода, вы делегируете базу данных в Doctrine. Доктрина делает замечательную работу в этой области.

Поскольку вы хотите, чтобы ваши клиенты / партнеры обновлялись до последней версии модели, вы должны использовать Doctrine Migrations (http://symfony.com/doc/current/bundles/DoctrineMigrationsBundle/index.html ). Тот'способ управлять обновлениями базы данных. Более того, он дает вам полный контроль над тем, что делать при обновлении / понижении уровня базы данных. Вы можете, например, установить значения по умолчанию перед добавлением FK.

Шаги для добавления нового свойства в класс должны быть:

изменить класс:

Acme \ MyBundle \ Entity \ Customer и добавьте свойство, которое вы хотите;

Acme\MyBundle\Entity\Customer

или измените файл доктрины:

Acme/MyBundle/Resources/config/doctrine/customer.yml

запустить консольную команду (она добавит правильный набор / получить в классе)

php app/console doctrine:generate:entities AcmeMyBundle:Customer

запустить консольную команду

php app/console doctrine:migrations:diff

запустите консольную команду (она поместит новый файл в app / DoctrineMigrations)

php app/console doctrine:migrations:migrate

Когда ты'для развертывания новой версии кода все, что вам нужно сделать, это обновить исходный код и выполнить команду выше.

Для Symfony 3:

изменить класс:

Acme \ MyBundle \ Entity \ Customer и добавьте свойство, которое вы хотите;

Acme\MyBundle\Entity\Customer

или измените файл доктрины:

Acme/MyBundle/Resources/config/doctrine/customer.yml

запустить консольную команду (она добавит правильный набор / получить в классе)

php bin/console doctrine:generate:entities AcmeMyBundle:Customer

запустить консольную команду (обновить базу данных)

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

 YakovL03 авг. 2017 г., 16:35
парень с низкой репутацией пытался добавить это с правкой; Я'Выложу это здесь, так как это может быть полезно: дляphp bin/console doctrine:schema:update --force: ПРЕДУПРЕЖДЕНИЕофициальные документы предположить, что не следуетНе используйте это в производственной среде!

вам нужно обновить таблицу отношений вручную, чтобы отобразить отношения. Я нашел это:обсуждение

Опять же, мы можем генерировать сущности из существующей базы данных, в целом, но отдельно? :(

Тот'Как это работает для меня:

добавить новые переменные, сеттеры и геттеры внутри существующего класса:
    src-->AppBundle-->Entity-->YourClassName.php
обновить файл ORM:
  src-->AppBundle-->Resources-->config-->doctrine-->YourClassName.orm.yml
запустить команду bash:
  php bin/console doctrine:schema:update --force

в котором определена ваша сущность, и добавить туда столбец. Затем вы используете командную строку и говорите

console doctrine:schema:update

Таким образом, ваши определения сущностей синхронизируются с базой данных, и ваша база данных обновляется.

которым я добавил новый столбец в YourBundle / Resources / Config / doctrine / Yourentity.orm.yml.

Затем добавлены методы получения и установки внутри класса Entity.

Потом сделалphp app/console doctrine:schema:update --force с консоли. Это сработало для меня.

ДЛЯ ПОЛЬЗОВАТЕЛЕЙ SYMFONY3 ...

чтобы внести изменения в вашу сущность. Шаг 1: Откройте файл вашей сущности .. Для EX: "Acme \ MyBundle \ Entity \ Book»

Текущий объект имеет несколько полей, таких как: идентификатор, имя, заголовок и т. Д. Теперь, если вы хотите добавить новое поле "образ" и сделать изменение ограничения "заглавие" поле, а затем добавить поле "образ" с геттером и сеттером

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

И добавить геттер и сеттер

/**
     * Set image
     *
     * @param string $image
     *
     * @return Book
     */
    public function setImage($image)
    {
        $this->image = $image;

        return $this;
    }

    /**
     * Get image
     *
     * @return string
     */
    public function getimage()
    {
        return $this->image;
    }
Обновить существующее ограничение поля заголовка с длины 255 до 500
/**
     * @var string
     *
     * @ORM\Column(name="title", type="string", length=500)
     */
    private $title;

Хорошо ... Вы внесли изменения в соответствии с вашими потребностями, и вы в одном шаге.

Шаг 2: Запустите эту команду в каталоге проекта

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

Теперь проверьте вашу таблицу в базе данных, этоГотово!

php app/console doctrine:migrations:diff описано выше при использовании доктрин миграции.

Вы внесли изменения в сущность, все кажется действительным, но команда по созданию миграцийphp app/console doctrine:migrations:diff говорит "Изменения не обнаружены в вашей картографической информации. "

И ты можешьнайти где 'Если размещена старая структура базы данных, поиск по файлам ничего не нашел.

Для меня ключ должен был очистить кеш Redis.

php app/console redis:flushdb

Это происходит из-за config.yml

snc_redis:
    clients:
        default:
            type: predis
            alias: default
            dsn: redis://localhost
    doctrine:
        query_cache:
            client: default
            entity_manager: default
            namespace: "%kernel.root_dir%"
        metadata_cache:
            client: default
            entity_manager: default
            document_manager: default
            namespace: "%kernel.root_dir%"
        result_cache:
            client: default
            namespace: "%kernel.root_dir%"
            entity_manager: [default, read]  # you may specify multiple entity_managers

После этого миграции: diff перечитали все сущности (вместо того, чтобы брать устаревшие метаданные из кеша) и создали правильную миграцию.

Итак, полная цепочка шагов для изменения сущностей:

Измените свой класс сущности (отредактируйте файл сущности)Очистить кэш метаданных Redis ()php app/console redis:flushdbСоздать (и может быть редактировать) миграцию ()php app\console doctrine:migrations:diffВыполнить миграцию ()php app\console doctrine:migrations:migrate

Конечно, ваш кэш метаданных доктрины может быть не Redis, а чем-то другим, например, файлами в app / cache или чем-то другим. Дон»не забудьте подумать об очистке кэша.

Может быть, это помогает кому-то.

 antongorodezkiy12 дек. 2016 г., 17:26
Вау, это было неожиданно, особенно когдаcache:clear А не было»не решить проблему, но Redis Flush сделал.

Ваш ответ на вопрос