Intereting Posts
декодировать php pdo и html В PHP лучший способ обеспечить текущий рабочий каталог такой же, как скрипт, при использовании CLI Расширение APC и Custom Mmap PHP – выход или возврат, который лучше? Основной взлом foreach Как мы можем отправлять сообщения GCM в большом количестве 1000 в базу данных, скажем, из 10 000 зарегистрированных пользователей? Создание экземпляра класса PHP со строкой Преобразуйте PNG в JPG и установите прозрачный фон в белый цвет с помощью ImageMagick и PHP regex вытащить все атрибуты из всех метатег Пропустить модельный аксессуар jQuery: как остановить функцию AJAX, избегая строки JSON, используемой для данных POST Добавьте одно приращение, если существует тот же ключ с числовым массивом Функция Smarty Object с ассоциативным массивом Неожиданный «=>», ожидаемый один из: «», «», «)», WordPress объединяет запросы Какой лучший метод PHP для уменьшения размера изображения без потери качества

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

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

php app/console doctrine:modify:entity 

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

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

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

Доктрина – инструмент ORM (Object-Relational Mapping). Это означает, что вы хотите абстрагировать базу данных из вашего 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

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

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

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

    php app/console doctrine:migrations:diff

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

    php app/console doctrine:migrations:migrate

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

Для Symfony 3:

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

    • Acme \ MyBundle \ Entity \ Customer и добавьте требуемое свойство;

      Acme\MyBundle\Entity\Customer

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

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

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

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

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

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

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

 console doctrine:schema:update 

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

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

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

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

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

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

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

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

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

Current Entity имеет несколько полей, таких как: id, name, title и т. Д. Теперь, если вы хотите добавить новое поле «изображение» и внести ограничение изменения в поле «title», добавьте поле «image» с помощью getter и setter

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

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

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

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

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

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

    ЦСИ -> AppBundle -> Entity -> YourClassName.php

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

    SRC -> AppBundle -> Ресурсы -> конфигурация -> Доктрина -> YourClassName.orm.yml

  • команда запуска bash:

    php bin / console doctrine: schema: update –force