教义 - 以表为目标的多对多

Posted

技术标签:

【中文标题】教义 - 以表为目标的多对多【英文标题】:Doctrine - ManyToMany with table as target 【发布时间】:2014-07-07 14:30:18 【问题描述】:

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

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

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

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

我想在 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;

【问题讨论】:

我会创建一个类似JobApplication 的类来连接员工、工作和服务……您可能迟早会想在那里添加更多信息……可能性包括created_atconfirmed_atconfirmed_by 之类的东西... 这是我不想要的,但似乎是唯一的可能性...... 我认为您的 Service2Job 表实际上应该是 3 向表关系(user_idjob_idservice_id 上具有唯一/主键,@ 上具有索引987654330@和service_id) @Talus - 有可能 2 名员工做同样的服务(例如,如果他们一起工作),所以唯一约束不是一个好主意。 因此三个字段上的唯一/主键:员工不能多次在服务/工作中,对吗?如果是 2 名员工,那么关键是尊重。如果你想获取所有员工的工作和服务,你可以做一个基本的SELECT employee FROM services2jobs WHERE service_id = ? AND job_id = ?,因此这两个字段的索引。 【参考方案1】:

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

Service
 - jobs

Jobs
 - services

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

Employees
 - services2jobs

【讨论】:

我像以前一样离开了我的数据库模型,并按照 @nifr 的建议创建了一个额外的对象来映射 service2job 属性,但是你关于这不再是关系的声明让我大开眼界。

以上是关于教义 - 以表为目标的多对多的主要内容,如果未能解决你的问题,请参考以下文章

从教义中的多对多自引用实体中获取孩子

带有额外列的多对多自引用原则

教义多对多关系问题

教义加入多对多没有关联

教义 - 在多对多关系表中插入记录

教义2多对多带翻译