【问题标题】:Symfony Doctrine - Make fixtures with ManyToManySymfony Doctrine - 使用 ManyToMany 制作固定装置
【发布时间】:2019-10-31 21:35:33
【问题描述】:

我将 Symfony 4.2 与 Doctrine 一起使用,我想创建具有与两个实体的多对多关系的固定装置:

  • 组织结构
  • 项目

但当我加载固定装置时,连接表 (organization_project) 始终为空。所以,我不知道我的人际关系好不好。

简历:

  • 很多组织都有很多项目
  • 很多项目有很多组织

数据库视图

这是我的Organization 实体

class Organization
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    ...

    /** 
     * @ORM\ManyToMany(targetEntity="App\Entity\Project", mappedBy="organizations")
     */
    private $projects;

    /**
     * @return Collection|Project[]
     */
    public function getProjects(): Collection
    {
        return $this->projects;
    }

    public function addProject(Project $project): self
    {
        if (!$this->projects->contains($project)) {
            $this->projects[] = $project;
            $project->addOrganization($this);
        }

        return $this;
    }

    public function removeProject(Project $project): self
    {
        if ($this->projects->contains($project)) {
            $this->projects->removeElement($project);
            $project->removeOrganization($this);
        }

        return $this;
    }
}

这里是我的Project 实体:

class Project
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    ...

    /** 
     * @ORM\ManyToMany(targetEntity="App\Entity\Organization", inversedBy="projects")
     */
    private $organizations

    /**
     * @return Collection|Organization[]
     */
    public function getOrganizations(): Collection
    {
        return $this->organizations;
    }

    public function addOrganization(Organization $organization): self
    {
        if (!$this->organizations->contains($organization)) {
            $this->organizations[] = $organization;
        }

        return $this;
    }

    public function removeOrganization(Organization $organization): self
    {
        if ($this->organizations->contains($organization)) {
            $this->organizations->removeElement($organization);
        }

        return $this;
    }

}

这是我的Organization 夹具:

class OrganizationFixtures extends Fixture implements DependentFixtureInterface
{
    public const ORGANIZATION_REFERENCE = 'organization-';

    public function load(ObjectManager $manager)
    {
        $organization = new Organization();
        $this->addReference(self::ORGANIZATION_REFERENCE.'0', $organization);
        $organization->addProject($this->getReference('project-0'));

        $manager->persist($organization);
        $manager->flush();
    }

     public function getDependencies()
    {
        return array(
            ProjectFixtures::class
        );
    }
} 

这是我的Project 夹具:

class ProjectFixtures extends Fixture
{
    public const PROJECT_REFERENCE = 'project-';

    public function load(ObjectManager $manager)
    {
        $project = new Project();
        $this->addReference(self::PROJECT_REFERENCE.'0', $project);

        $manager->persist($project);
        $manager->flush();
    }
} 

谢谢你,

【问题讨论】:

  • 你的桌子可能是空的吗?你能提供更多信息在哪一点失败?
  • 在我的连接表 (organization_project) 中,加载我的固定装置后数据不会出现。此外,我的控制台没有错误。我用数据库屏幕发布我的帖子
  • 是的,但是您的 Organization_project 表是空的。也许连接没有找到任何记录?
  • 谢谢我解决了我的问题。我的组织实体没有拥有方

标签: php symfony doctrine relationship fixtures


【解决方案1】:

您的Organization 不是关系的owning side。它不包含加入表的知识(在ManyToOne 中,它将是关于谁持有外键)。此外,您没有在 persist 上指定 cascading,因此不会保留非拥有方的关联实体。因此,对于您当前的夹具结构,最佳关联方向是这样的。

class Organization
{
...

    /** 
     * @ORM\ManyToMany(targetEntity="App\Entity\Project", inversedBy="organizations", cascade={"persist"})
     * @ORM\JoinTable(name="organization_project") # this one is not necessary
                                                       putting here for reference
     */
    private $projects;
...
]
class Project
{
...
    /** 
     * @ORM\ManyToMany(targetEntity="App\Entity\Organization", mappedBy="projects", cascade={"persist"})
     */
    private $organizations;
...
}

【讨论】:

  • 它有效,谢谢!因此,如果我理解,在 ManyToMany 中我们有两个所有者方,当我们在实体中使用 inversedBy 时,该实体是所有者?
  • 是的,虽然在使用cascade={"persist"} 时仍然可以保留非拥有方,但是根据您的夹具的逻辑,最好在Organization 上拥有拥有方
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-06
  • 2019-03-14
  • 1970-01-01
相关资源
最近更新 更多