Добавление столбца в существующий объект в Symfony
Я играл с Symfony на своем веб-сервере, и я создавал сущность с доктриной для моей базы данных. Я хотел добавить столбец к одному из этих объектов... Я хотел сделать что-то вроде:
php app/console doctrine:modify:entity
Теперь я знаю, что эта команда не существует, но есть способ (без выполнения всей миграции) просто добавить столбец.
P.S. Я знаю, что могу открыть php файл и добавить текстовый столбец, а затем обновить схему, но я распространяю это на некоторые клиенты, и мне нравится более "подход командной строки".
Ответы
Ответ 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
src-->AppBundle-->Resources-->config-->doctrine-->YourClassName.orm.yml
php bin/console doctrine:schema:update --force