Doctrine - ManyToMany以table为目标

时间:2014-07-07 14:30:19

标签: php postgresql symfony doctrine-orm annotations

在Doctrine中是否可以创建与表作为targetEntity的ManyToMany(单向)关系?

我有以下数据库星座: 通过Doctrine ManyToMany(连接表称为 service2job )连接的作业服务表,因为作业可以有多个服务且相同服务可以出现在不同的工作中。 现在有一个表员工。员工可以根据工作做一些服务。

这是一个棘手的问题:一个或多个员工可以根据工作在同一服务上工作。 所以我需要另一个连接service2job和employee( emp2ser2job )的连接表,它应该由Doctrine生成。

Doctrine / Symfony 方面: 作业服务在作业类中保存为 ArrayCollection 。服务和作业通过Doctrine ManyToMany(Annotation)连接。

我想在 Employee 类中根据工作和员工完成的服务来保存服务。 但问题是:要做到这一点,我需要将Employee中的ManyToMany关系引用到表service2job,因为我不想创建一个我只需要引用的类Service2Job。

有没有可能在没有创建类(Emp2Ser2Job)的情况下进行映射和作为实体引用?

代码:

// Service
class Service 
{
  private $id;
}

// Job
...
use Doctrine\ORM\Mapping as ORM;
...

class Job 
{
   public function __construct() 
   {
     $this->services = new ArrayCollection();
   }
   /**
   * @ORM\ManyToMany(targetEntity="KuMiV\ServicesBundle\Entity\Service")
     // table that should be targetEntity in Employee ($services);
   * @ORM\JoinTable(name="service2job",
   *      joinColumns={@ORM\JoinColumn(name="job_id", referencedColumnName="id")},
   *      inverseJoinColumns={@ORM\JoinColumn(name="service_id",  referencedColumnName="id")}
   *      )
   **/
   private $services;
   ...
}

// Employee
class Employee 
{
   public function __construct() 
   {
     $this->services = new ArrayCollection();
   }

   /**
   * @ORM\ManyToMany //how should annotation be here to make a ManyToMany unidirectional to the table service2job?
   * @ORM\JoinTable(name="employee2service2job",
   *      joinColumns={@ORM\JoinColumn(name="employee_id", referencedColumnName="id")},
   *      inverseJoinColumns={@ORM\JoinColumn(name="job_id", referencedColumnName="job_id"), @ORM\JoinColumn(name="service_id", referencedColumnName="service_id")}
   *      )
   **/
   private $services;
}

1 个答案:

答案 0 :(得分:1)

当一段关系有另一个参考/属性时,它不再是一种关系,为什么?因为如果一个关系需要更多的引用/属性,那么它应该作为模型处理。在你的情况下,你应该遵循@ Talu的建议。

Service
 - jobs

Jobs
 - services

Service2Job
 - jobs
 - services
 - employees //this converts your relationship in model

Employees
 - services2jobs