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