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

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

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

php app/console doctrine:modify:entity

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

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

4b9b3361

Ответ 1

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

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

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

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

Для Symfony 2:

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

    • 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

Ответ 2

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

console doctrine:schema:update

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

Ответ 3

На этапе 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

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


Таким образом, полная цепочка шагов для модификации объектов:

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

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

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

Ответ 4

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

Затем добавлены методы getter и setter внутри класса Entity.

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

Ответ 5

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

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

Текущая организация имеет несколько полей, таких как: id, name, title и т.д. Теперь, если вы хотите добавить новое поле "image" и внести ограничение изменения в поле "title", добавьте поле "image" с помощью getter и setter

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

И добавьте getter и setter

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

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

Ответ 6

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

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

Ответ 7

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

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