【问题标题】:Multiple join tables between 2 tables with Symfony使用 Symfony 的 2 个表之间的多个连接表
【发布时间】:2017-03-24 16:23:12
【问题描述】:

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

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

我已经有一个项目和员工实体。 如何与注解建立联系?

已经尝试过多对多双向关系。但是学说会生成 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();
    }

    // ...
}

【问题讨论】:

  • 您能否在 Employee 中添加一个字段来指定他们是 ProjectManager 还是 ProjectEmployee?假设他们不能同时是...
  • 您需要创建 ProjectManagers 和 ProjectEmployees 实体,然后根据需要建立一对多关系。

标签: php mysql symfony doctrine-orm annotations


【解决方案1】:

您不能将这两个表创建为查找表,然后创建关系吗?例如,使用字段 id、project_id 和 employee_id 创建一个 ProjectManagers 实体。 ProjectEmployees 也是如此。对于 ProjectManagers 实体,您将创建从 Projects 到 ProjectManagers 的一对多。雇员实体也是如此。如果你正确设置了你的关系,你就可以在你的控制器中做这样的事情:

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

【讨论】:

    【解决方案2】:

    据我所知,这是不可能的。我为您知道了三种选择:

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

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

    c) 建立多对多单向关系,使员工不知道反向实体。

    周末去:-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-28
      • 2019-02-25
      相关资源
      最近更新 更多