是否可以在不删除数据库的情况下加载doctrine fixture

时间:2014-03-05 02:42:36

标签: php symfony doctrine-orm fixtures

我在fixtures中定义了一些doctrine

当我尝试使用此

运行时

php app/console doctrine:fixtures:load然后它要求我清除数据库。

是否可以在不清除数据库的情况下加载它。

我记得Djangofixtures,可以在不清除现有数据库的情况下加载到单独的表中

3 个答案:

答案 0 :(得分:35)

使用--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

答案 1 :(得分:2)

DoctrineFixtures很适合空数据库或开发中的第一个init - 但不适用于生产。

查看DoctrineMigrations和symfonys DcotrineMigrationsBundle,这是在生产环境中迁移数据库的一种安全的好方法。

答案 2 :(得分:1)

可以将以前添加的数据更新到DB(通过运行 app / console doctrine:fixtures:load 加载)。我使用了EntityManager-> createQuery。

但我仍然想知道是否有机会通过简单地运行app / console命令来实现它。类似 app / console doctrine:schema:update --force ,但应用于数据本身。

现在我不得不写一大堆代码来更新我的数据并正确添加。例如,要使 - 追加工作,我必须编写以下内容:

    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();
            }
        }
    }