Можно ли загрузить доктрины без удаления базы данных
Я определил некоторый fixtures
в doctrine
.
Когда я пытаюсь запустить с помощью этого
php app/console doctrine:fixtures:load
, тогда он просит меня очистить базу данных.
можно загрузить его без очистки базы данных.
Я помню Django
имеет fixtures
, который может быть загружен в отдельные таблицы без очистки существующей базы данных
Ответы
Ответ 1
Используйте параметр --append
php app/console help doctrine:fixtures:load
Usage:
doctrine:fixtures:load [--fixtures[="..."]] [--append] [--em="..."] [--purge-with-truncate]
Options:
--fixtures The directory or file to load data fixtures from. (multiple values allowed)
--append Append the data fixtures instead of deleting all data from the database first.
--em The entity manager to use for this command.
--purge-with-truncate Purge data by using a database-level TRUNCATE statement
Ответ 2
Можно обновить ранее добавленные данные в DB (который был загружен при запуске приложения/консоли doctrine: fixtures: load). Для этого я использовал EntityManager- > createQuery.
Но я все еще удивляюсь, есть ли возможность когда-либо или просто когда-нибудь, просто запустив команду app/console. Что-то вроде доктрины app/console: schema: update -force, но применяется к самим данным.
На данный момент мне пришлось написать тонну кода, чтобы мои данные обновлялись и добавлялись правильно. Например, чтобы сделать работу -append, мне пришлось написать следующее:
class LoadCategoryData implements FixtureInterface
{
/**
* {@inheritDoc}
*/
public function load(ObjectManager $em)
{
//a category has name and shortcut name (st)
$categories = array (
[0]=> array('name' => 'foo', 'st' = 'bar'),
...
);
foreach ($categories as $cat) {
$query = $em->createQuery(
"SELECT c
FROM MyBundle:Category c
WHERE c.st = ?1"
)->setParameter(1, $cat['st'])->getResult();
if (count($query) == 0) {
$c = new Category();
$c->setName($cat['name']);
$c->setSt($cat['st']);
$em->persist($c);
}
$em->flush();
}
}
}
Ответ 3
DoctrineFixtures хороши для первого инициализации пустой базы данных или в разработке, но не в производстве.
Взгляните на DoctrineMigrations и symfonys DcotrineMigrationsBundle, это хороший и безопасный способ миграции вашей базы данных в производство.