web-dev-qa-db-ja.com

データベースを削除せずにdoctrineフィクスチャをロードすることは可能ですか?

fixturesdoctrineを定義しました。

これを使って走ろうとすると

php app/console doctrine:fixtures:load次に、データベースを削除するように求められます。

データベースを削除せずにロードすることは可能ですか?.

Djangoにはfixturesがあり、既存のデータベースを削除せずに別のテーブルにロードできることを覚えています。

19
user1994660

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

DoctrineFixturesは、空のデータベースの最初の初期化または開発中の場合に適していますが、本番環境では適していません。

DoctrineMigrations およびsymfonys DcotrineMigrationsBundle を見てください。これは、本番環境でデータベースを移行するための優れた安全な方法です。

2
Christin Gruber

以前に追加されたデータをDBに更新することができます(これはapp/console doctrine:fixtures:loadを実行してロードされました)そのためにEntityManager-> createQueryを使用しました。

しかし、app/consoleコマンドを実行するだけでそれを実行できる機会があるのか​​、それともこれからもそうなるのではないかと思います。 app/console doctrine: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();
            }
        }
    }
1