Добавьте столбец в существующую сущность в Symfony
Я играл с Symfony на своем веб-сервере и создавал сущность с доктриной для своей базы данных. Я хотел добавить столбец в одну из этих сущностей... Я хотел сделать что-то вроде:
php app/console doctrine:modify:entity
Теперь я знаю, что этой команды не существует, но есть ли способ (без выполнения полной миграции) просто добавить столбец.
P.S. Я знаю, что мог бы открыть php-файл и текстуально добавить туда столбец, а затем обновить схему, но я распространяю это среди некоторых клиентам и мне нравится более "похожий на командную строку" подход.
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
Вы определенно хотите открыть файл 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 перечитал все сущности (вместо того, чтобы брать устаревшие метаданные из кэша) и создал правильную миграцию.
Итак, полная цепочка шагов для изменения сущностей такова:
- Измените свой класс сущностей (отредактируйте файл сущностей)
- Очистить кэш метаданных Redis (
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.
Затем добавил методы получения и установки внутри класса сущностей.
Затем сделал php app/console doctrine:schema:update --force
с консоли. Это сработало для меня.
ДЛЯ ПОЛЬЗОВАТЕЛЕЙ 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
Теперь проверьте свою таблицу в базе данных, все готово!!
Я думаю, вам нужно обновить таблицу отношений вручную, чтобы отобразить отношения. Я нашел это: обсуждение
Опять же, мы можем генерировать сущности из существующей базы данных в целом, но отдельно? :(
Вот как это сработало для меня:
-
Добавьте новые переменные, установщики и получатели внутри существующего класса:
Src -->AppBundle -->Сущность -->YourClassName.php
-
Обновите файл ORM:
Src -->AppBundle -->Ресурсы -->конфигурация -->доктрина -->Имя вашего класса.orm.yml
-
Выполнить команду bash:
Php bin/консольная доктрина: схема: обновление --принудительное