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


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

php app/console doctrine:modify:entity

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

P.S. Я знаю, что мог бы открыть php-файл и текстуально добавить туда столбец, а затем обновить схему, но я распространяю это среди некоторых клиентам и мне нравится более "похожий на командную строку" подход.

Author: nevero, 2013-02-18

7 answers

На самом деле, использование Доктрины вообще не имеет смысла делать что-то, как вы предложили.

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

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

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

  • Измените класс следующим образом:

    • Acme\MyBundle\Сущность\Клиент и добавьте свойство, которое вы хочу;

      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\Сущность\Клиент и добавьте нужное свойство;

      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

 65
Author: P. R. Ribeiro, 2017-03-02 19:24:49

Вы определенно хотите открыть файл PHP/XML/YML, в котором определена ваша сущность, и добавить туда столбец. Затем вы используете командную строку и говорите

console doctrine:schema:update

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

 8
Author: Tom, 2013-02-19 00:10:12

На шаге 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 перечитал все сущности (вместо того, чтобы брать устаревшие метаданные из кэша) и создал правильную миграцию.


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

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

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

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

 3
Author: FlameStorm, 2016-05-12 10:32:40

Я нашел способ добавить новый столбец в YourBundle/Resources/Config/doctrine/Yourentity.orm.yml.

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

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

 1
Author: Mihir Bhende, 2015-09-23 13:51:11

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

Здесь вам нужно выполнить два шага, чтобы внести изменения в свою сущность Шаг 1: Откройте Файл Сущности..Например: "Acme\MyBundle\Сущность\Книга"

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

/**
     * @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

Теперь проверьте свою таблицу в базе данных, все готово!!

 1
Author: Kunal, 2016-12-13 10:17:44

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

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

 0
Author: Mayukh Roy, 2017-05-23 12:18:00

Вот как это сработало для меня:

  • Добавьте новые переменные, установщики и получатели внутри существующего класса:

    Src -->AppBundle -->Сущность -->YourClassName.php

  • Обновите файл ORM:

    Src -->AppBundle -->Ресурсы -->конфигурация -->доктрина -->Имя вашего класса.orm.yml

  • Выполнить команду bash:

    Php bin/консольная доктрина: схема: обновление --принудительное

 0
Author: Tech Nomad, 2017-12-15 15:09:57