原则2 在联接表或映射表中插入数据


Doctrine2 Insert the data in the Join tables or mapping table

我有一个场景,其中员工和组织表映射到名为 org_employees 的单独表中。

我分别为

员工表和组织表添加行没有问题,但我的问题是如何为org_employees表添加记录。我是否需要为org_employees表平均值创建一个单独的实体,如果是,ORM 关系是如何发生的。你能指导我吗?

Employee实体:

<?php
namespace Employee'Entity;
use Doctrine'Common'Collections'ArrayCollection;
use Doctrine'ORM'Mapping as ORM;
use Library'Entity'BaseEntity;
/**
 * @ORM'Entity
 * @ORM'Table(name="employees")
 */ 
class Employee extends BaseEntity{
    /**
     * @ORM'Column(name="employee_code", type="string")
     * @var string
     */
    protected $empCode;       
    public function getEmpCode() {
        return $this->empCode;
    }
    public function setEmpCode($empCode) {
        $this->empCode = $empCode;
        return $this;
    }
    public function __toString() {
        return __CLASS__ . ": [id: {$this->id}, name: {$this->name}]";
    }
}

Organization实体:

<?php
namespace Organization'Entity;
use Doctrine'Common'Collections'ArrayCollection;
use Doctrine'ORM'Mapping as ORM;
use Library'Entity'BaseEntity;   
/**
 * @ORM'Entity
 * @ORM'Table(name="organizations")
 */
class Organization extends BaseEntity{
    /**
     * @ORM'Column(name="name", type="string")
     * @var string
     */
    protected $name; 
    public function getName() {
        return $this->name;
    }
    public function setName($name) {
        $this->name = $name;
    }
    public function __toString() {
        return __CLASS__ . ": [id: {$this->id}, name: {$this->name}]";
    }
}

你可以做两件事。

  1. EmployeeOrganization之间添加ManyToMany关系。

  2. 添加介于两者之间的其他实体EmployeeOrganization(Link)。这意味着:

    Employee - ManyToOne - EmployeeOrganization(Link) - OneToMany - Organization

此解决方案在原则文档中也提到了:

为什么多对多关联不太常见?因为您经常希望将其他属性与关联相关联,在这种情况下,您需要引入关联类。因此,直接多对多关联消失,取而代之的是 3 个参与类之间的一对多/多对一关联。

当涉及到您的实体定义时,第一个解决方案是最简单的,但它只允许您进行链接,仅此而已。第二种解决方案的优点是可以向联接表添加其他字段(换句话说,属性或实体的属性(。例如,告诉您员工何时添加到组织的字段created_at

如果不需要这样的其他属性,您可以使用 ManyToMany .

关于如何定义这些关系,我想参考文档或其他堆栈溢出问题,那里有足够的信息。