これを正しい方法で行うのはそれほど難しいことではありません。何よりもまず、はい、あなたはを使用--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
は最後にありますが、データがすでに存在する場合は追加されません。