我在fixtures
中定义了一些doctrine
。
当我尝试使用此
运行时 php app/console doctrine:fixtures:load
然后它要求我清除数据库。
是否可以在不清除数据库的情况下加载它。
我记得Django
有fixtures
,可以在不清除现有数据库的情况下加载到单独的表中
答案 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();
}
}
}