繁体   English   中英

多对多关系上的 Symfony 数据固定装置

[英]Symfony data fixtures on ManyToMany relationship

我有两个实体CategoriesCriteria ,它们由ManyToMany关系链接。 它在数据库中生成了一个名为criteria_categories的新表。 我想要做的是使用 fixture 来填充entity Criteria和表criteria_categories categories table在数据库中已有数据。

所以我的问题是,如何从categories获取数据并使用夹具将它们插入到criteria_categories table

我的代码如下:

标准

class Criteria
{
    /**
     * @ORM\ManyToMany(targetEntity="Categories", inversedBy="criteria", cascade={"persist"})
     * @ORM\JoinTable(name="criteria_categories")
     **/
    private $categories;
}

类别

class Categories
{
    /**
     * @ORM\ManyToMany(targetEntity="Criteria", mappedBy="categories")
     **/
    private $criteria;
}

数据夹具

class LoadCriteria extends Fixture
{
    public function load(ObjectManager $manager)
    {
        $criteria = array(
            array(
                'label' => 'Test1'
            ),
            array(
                'label' => 'Test2'
            )
        );
        $cat = new Categories();

        foreach ($criteria as $critere) {
            $ctr = new Criteria();
            $ctr->setCriteriaLabel($critere['label']);
            $manager->persist($ctr);
        }

        $manager->flush();
    }

}

所以真正的问题是如何从类别中获取数据并在此夹具中使用它们来填充table criteria_categories

预先感谢您的回答。

在学说中,您可以忘记criteria_categories表。 criteria有一个categories的集合。 无需担心在幕后使用的额外表。

但是对于你的问题。 要从数据库中获取所有类别,您必须将此夹具定义为服务,然后注入实体管理器或您的“包装器”服务。

class LoadCriteria extends Fixture
{
    /**
     * @var CategoriesRepository
     */
    private $repository;

    public function __construct(EntityManagerInterface $em)
    {
        $this->repository = $em->getRepository(Categories::class);

    }
    public function load(ObjectManager $manager)
    {
        $this->categories = $repository->findAll();

        $criteria = array(
            array(
                'label' => 'Test1'
            ),
            array(
                'label' => 'Test2'
            )
        );
        $cat = new Categories();

        foreach ($criteria as $critere) {
            $ctr = new Criteria();
            $ctr->setCriteriaLabel($critere['label']);
            $manager->persist($ctr);
        }

        $manager->flush();
    }
}
  1. 如果您使用 symfony 3.3+ 的默认服务配置,则您的装置已经是一个服务。
  2. 如果不使用默认服务配置,则必须手动将夹具定义为服务。

     #services.yml App\\DataFixtures\\ORM\\CriteriaFixture: tags: [doctrine.fixture.orm]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM