7

私が走るとき

console doctrine:fixtures:load --fixtures=src/App/PeopleBundle/DataFixtures/ORM

エンティティを持つすべてのテーブルをドクトリンで削除したくありません。代わりに、明示的に指定されたディレクトリにあるフィクスチャのテーブルのみを削除したいと思います。

ただし、ターゲットディレクトリに関係なく、symfonyはすべてのバンドル内のすべてのエンティティを検索し、各エンティティに関連付けられているすべてのテーブルを削除しているようです。

フィクスチャを書いた特定のテーブルを除くすべてのテーブルを無視するようにsymfony2に指示するにはどうすればよいですか?

4

3 に答える 3

4

これを正しい方法で行うのはそれほど難しいことではありません。何よりもまず、はい、あなたはを使用--appendしますが、あなたはあなたが望まない余分なものをたくさん追加するでしょう。したがって、フィクスチャでいくつかの基本的なチェックを実行して、実際にフィクスチャを追加する必要があるかどうかを確認する必要があります(フィクスチャがすでにデータベースにある場合は、追加しません)。

ここで紹介する例は単純なものです。locators列を含むテーブルがあります:idname

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は最後にありますが、データがすでに存在する場合は追加されません。

于 2015-03-17T12:39:26.530 に答える
3

Doctrineは何をパージし、何をパージしないかをどのように理解することになっていると思いますか?フィクスチャには、ロードするエンティティを示す情報はありません。これが本当に必要な場合は、手動で行う必要があります。

まず、この--appendオプションを使用して、データベースのパージを回避できます。次に、フィクスチャで最初にできることは、関連するテーブルを切り捨てることです。

于 2012-08-10T07:02:17.520 に答える
1

オプションを使用して、選択したフィクスチャをロードでき--fixturesます。

あなたと一緒に--appendあなたがしたいことを制御することができるかもしれません、エンティティマネージャーによって管理されるすべてのテーブルにElnurによって言われるようにパージ効果を引き起こします。

于 2014-09-29T13:02:45.863 に答える