Я играл с 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 перечитывают все сущности (вместо того, чтобы принимать устаревшие метаданные из кеша) и создали правильную миграцию.
Таким образом, полная цепочка шагов для модификации объектов:
php app/console redis:flushdb
) php app\console doctrine:migrations:diff
) php app\console doctrine:migrations:migrate
) Конечно, ваш кеш метаданных доктрины может быть не Redis, а чем-то другим, например файлами в приложении / кеше или чем-то другим. Не забудьте подумать об очистке кеша.
Может быть, это помогает кому-то.
Я нашел способ, которым я добавил новый столбец внутри YourBundle / Resources / Config / doctrine / Yourentity.orm.yml.
Затем добавлены методы getter и setter внутри класса Entity.
Затем была php app/console doctrine:schema:update --force
с консоли. Это сработало для меня.
здесь вы должны выполнить два шага, чтобы внести изменения в свой объект. Шаг 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; }
/** * @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