Подтвердить что ты не робот

Можно ли загрузить доктрины без удаления базы данных

Я определил некоторый fixtures в doctrine.

Когда я пытаюсь запустить с помощью этого

php app/console doctrine:fixtures:load, тогда он просит меня очистить базу данных.

можно загрузить его без очистки базы данных.

Я помню Django имеет fixtures, который может быть загружен в отдельные таблицы без очистки существующей базы данных

4b9b3361

Ответ 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, это хороший и безопасный способ миграции вашей базы данных в производство.