Доктрина Symfony - Создавайте светильники с ManyToMany - PullRequest
1 голос
/ 18 июня 2019

Я использую Symfony 4.2 с Doctrine и хочу создать приборы с отношениями ManyToMany с двумя сущностями:

  • Организация
  • Проект

Но когда я загружаю приборы, таблица соединений (organization_project) всегда пуста. Так что я не знаю, хорошие ли у меня отношения.

Для резюме:

  • Многие организации имеют много проектов
  • Многие проекты имеют много организаций

Просмотр базы данных

database view

Вот моя 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();
    }
} 

Спасибо,

1 Ответ

1 голос
/ 18 июня 2019

Ваш Organization не является владельцем отношений.Он не содержит сведений о присоединении к таблице (в ManyToOne речь идет о том, кто держит внешний ключ).Также вы не указываете каскадирование на persist, поэтому связанные объекты на стороне, не являющейся владельцем, не будут сохраняться.Таким образом, для вашей текущей структуры прибора наилучшее направление ассоциации будет следующим:

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;
...
}
...