使用Symfony的2个表之间的多个连接表

时间:2017-03-24 16:23:12

标签: php mysql symfony doctrine-orm annotations

我想在同一个表之间创建多个关系

Project <--> ProjectManagers <--> Employees
Project <--> ProjectEmployees <--> Employees

我已经拥有了Project和Employees实体。 如何使用注释建立连接?

已经尝试过多对多,双向关系。但是,doctrine会产生1个连接表,但是需要一个projects_managers表。

<?php
/** @Entity */
class Project
{
    // ...

    /**
     * Many Projects have Many Employees.
     * @ManyToMany(targetEntity="Employee", inversedBy="projects")
     * @JoinTable(name="projects_employees")
     */
    private $employees;

    public function __construct() {
        $this->employees = new \Doctrine\Common\Collections\ArrayCollection();
    }

    // ...
}

/** @Entity */
class Employee
{
    // ...
    /**
     * Many Employees have Many Projects.
     * @ManyToMany(targetEntity="Project", mappedBy="employees")
     */
    private $projects;

    public function __construct() {
        $this->projects = new \Doctrine\Common\Collections\ArrayCollection();
    }

    // ...
}

2 个答案:

答案 0 :(得分:0)

据我所知,这是不可能的。我知道三种替代方案:

a)让ProjectManagers和ProjectEmployees扩展基类ProjectMembers并使用表继承。 (好文章:https://blog.liip.ch/archive/2012/03/27/table-inheritance-with-doctrine.html

b)在Employees实体中创建一个属性$ projectManagers和$ projectEmployees,以便关系分离。 (您可以在实体中编写一个为您合并两个数组的附加函数)

c)建立多对多的单向关系,以便Employees不知道反向实体。

去周末: - )

答案 1 :(得分:0)

你不能将这两个表创建为查找表然后创建关系吗?例如,使用字段id,project_id和employee_id创建ProjectManagers实体。 ProjectEmployees也是如此。对于ProjectManagers实体,您将从Projects到ProjectManagers创建一对多。 Employees实体也是如此。如果您正确设置了关系,则可以在控制器中执行以下操作:

$project = $this->getDoctrine()->getRepository( 'AppBundle:Projects' )->findById( $id );
$employees = $project->getProjectManagers()->getEmployees();