你能选择性地加载symfony2中的灯具吗?

时间:2012-08-09 22:39:17

标签: symfony fixtures

当我跑步时

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

我不希望doctrine清除每个拥有实体的表。相反,我只想清除显式指定目录中的灯具表。

但是,似乎无论目标目录如何,symfony都会查找每个包中的每个实体,并清除与每个实体关联的每个表。

如何指示symfony2忽略除我为其编写固定装置的特定表格之外的所有表格?

3 个答案:

答案 0 :(得分: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,但如果数据已经存在则不会附加。

答案 1 :(得分:1)

你如何看待Doctrine应该弄清楚要清除什么,不要清除什么?夹具中没有信息告诉它将加载哪些实体。如果你真的需要这个,你必须手动完成。

首先,您可以使用--append选项来避免清除数据库。其次,你可以在你的灯具中做的第一件事就是截断相关的表格。

答案 2 :(得分:1)

您可以使用--fixtures选项加载选定的灯具。

--append一起,您可能能够控制您想要执行的操作,从而导致清除影响,如清单所示,由实体经理管理的每个表格。