fixtures
にdoctrine
を定義しました。
これを使って走ろうとすると
php app/console doctrine:fixtures:load
次に、データベースを削除するように求められます。
データベースを削除せずにロードすることは可能ですか?.
Django
にはfixtures
があり、既存のデータベースを削除せずに別のテーブルにロードできることを覚えています。
使用 --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
DoctrineFixturesは、空のデータベースの最初の初期化または開発中の場合に適していますが、本番環境では適していません。
DoctrineMigrations およびsymfonys DcotrineMigrationsBundle を見てください。これは、本番環境でデータベースを移行するための優れた安全な方法です。
以前に追加されたデータを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();
}
}
}