Symfony数据夹具与ManyToMany的关系

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Symfony数据夹具与ManyToMany的关系相关的知识,希望对你有一定的参考价值。

我有两个由ManyToMany关系链接的实体Categories和Criteria。它在数据库中生成了一个名为criteria_categories的新表。我想要做的是使用夹具填充entity Criteria和表criteria_categoriescategories table已经在数据库中有数据。

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

我的代码如下:

标准

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

分类

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

DataFixtures

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。不必担心幕后使用的其他表格。

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

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+中的default service configuration,您的灯具已经是一项服务。
  2. 如果不使用默认服务配置,则必须手动将夹具定义为服务。 #services.yml AppDataFixturesORMCriteriaFixture: tags: [doctrine.fixture.orm]

以上是关于Symfony数据夹具与ManyToMany的关系的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2-Doctrine:ManyToMany 关系未保存到数据库

Symfony 的 make:entity 命令创建的 ManyToMany 关系之间的握手

Symfony2 2.3.7 -Doctrine 2.4.1:ManyToMany 关系未保存到数据库

Symfony 在具有 ManyToMany 关系的两个表之间具有相同的 @groups

Symfony学说OneToAll关系

如何在 symfony WebTestCase 的测试中按夹具类型获取教义夹具参考?