当我跑步时
console doctrine:fixtures:load --fixtures=src/App/PeopleBundle/DataFixtures/ORM
我不希望doctrine清除每个拥有实体的表。相反,我只想清除显式指定目录中的灯具表。
但是,似乎无论目标目录如何,symfony都会查找每个包中的每个实体,并清除与每个实体关联的每个表。
如何指示symfony2忽略除我为其编写固定装置的特定表格之外的所有表格?
答案 0 :(得分:4)
以正确的方式解决这个问题真的不是那么难。首先,是的,你使用--append
,但你会添加一些你不想要的额外东西。因此,您需要在灯具中执行一些基本检查,看看您是否确实需要添加它们(如果它们已经存在于数据库中,则不需要)。
我要向您展示的示例很简单:我有一个locators
表,其中包含以下列:id
和name
。
namespace Application\Model\Fixtures;
use Doctrine\Common\DataFixtures\OrderedFixtureInterface,
Doctrine\Common\DataFixtures\FixtureInterface,
Doctrine\Common\Persistence\ObjectManager,
Application\Model\Entity\Locator;
/**
* Class LoadLocators
*
* Pre-populates the locators table
*
* @package Application\Model\Fixtures
*/
class LoadLocators implements FixtureInterface, OrderedFixtureInterface
{
/**
* @var array The locators names that will be inserted in the database table
*/
protected $locators = ['id', 'xpath', 'css'];
/**
* {@inheritDoc}
*/
public function load(ObjectManager $manager)
{
foreach ($this->locators as $locatorName)
{
$locator = $this->findOrCreateLocator($locatorName, $manager);
/** Check if the object is managed (so already exists in the database) **/
if (!$manager->contains($locator))
{
$manager->persist($locator);
}
}
$manager->flush();
}
/**
* Helper method to return an already existing Locator from the database, else create and return a new one
*
* @param string $name
* @param ObjectManager $manager
*
* @return Locator
*/
protected function findOrCreateLocator($name, ObjectManager $manager)
{
return $manager->getRepository('Application\Model\Entity\Locator')->findOneBy(['name' => $name]) ?: new Locator($name);
}
/**
* {@inheritDoc}
*/
public function getOrder()
{
return 1;
}
}
这里的简单更改是,如果对象已存在于数据库中,请找到它并使用该对象。真的很简单。
我现在运行的命令最后有--append
,但如果数据已经存在则不会附加。
答案 1 :(得分:1)
你如何看待Doctrine应该弄清楚要清除什么,不要清除什么?夹具中没有信息告诉它将加载哪些实体。如果你真的需要这个,你必须手动完成。
首先,您可以使用--append
选项来避免清除数据库。其次,你可以在你的灯具中做的第一件事就是截断相关的表格。
答案 2 :(得分:1)
您可以使用--fixtures
选项加载选定的灯具。
与--append
一起,您可能能够控制您想要执行的操作,从而导致清除影响,如清单所示,由实体经理管理的每个表格。