Symfony Doctrine - 使用 ManyToMany 制作固定装置

Symfony Doctrine - Make fixtures with ManyToMany

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

但是当我加载固定装置时,连接 table (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 不是 persist 上的 owning side of the relationship. It does not hold knowledge of joining table (in ManyToOne it would be about who is holding foreign key). Also you don't specify 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;
...
}