Symfony2与colum的实体关系

问题描述:

我正在用symfony2构建我的第一个应用程序。我想用实体创建这个数据库布局。Symfony2与colum的实体关系

#文件

DOCUMENT_ID | INT | AI | PK

document_name | STRING

服务|关系MANY2MANY

...

#服务

的service_id | INT | AI | PK

service_name | STRING

...

* #_table_document_service *

DOCUMENT_ID | INT

service_id | INT

amount | INT |默认1

创建实体文档和服务不是问题。要创建文件和服务之间的关系,我将使用多对多,关系像这样的:

/** 
* @ORM\ManyToMany(targetEntity="Services") 
* @ORM\JoinTable(name="_table_document_service", 
*  joinColumns={@ORM\JoinColumn(name="document_id", referencedColumnName="id")}, 
*  inverseJoinColumns={@ORM\JoinColumn(name="service_id", referencedColumnName="id")} 
*) 
*/ 
private $services; 

但我想,在连接表也应该有一个名为金额栏。我怎样才能做到这一点?

考虑到你想在一个关系上添加额外的字段,那么它不再是一个关系,而是清楚地 - “设计”地讲 - 一个关联对象。

因此,你在“表格文档服务”表要的是这样的事情

文档-------表文档服务--------服务

做所以意味着两两件事:文献----表文件服务和表文件服务--------服务

A排序表文件中“复合键”之间

多对一关联基于这些关联的服务实体(您的主键) en成为这些对象之间关系的组合。

以下是一些示例:as you can see in the official doctrine 2 documentation您可以使用复合键进行基于manytoone的assotions,如下所示。

编辑:这里是一些代码,试图按照你的例子。

use Doctrine\ORM\Mapping\Entity, Doctrine\ORM\Mapping\Id, Doctrine\ORM\Mapping\Column, Doctrine\ORM\Mapping\ManyToOne, Doctrine\ORM\Mapping\OneToMany; 

/** @Entity */ 
class Document 
{ 
    /** @Id @Column(type="integer") @GeneratedValue */ 
    protected $id; 

    /** @OneToMany(targetEntity="OrderItem", mappedBy="document") */ 
    protected $tableDocumentService; 

    /** your attributes here, it isn't important here **/ 

    public function __construct(Customer $customer) 
    { 
     $this->tableDocumentService = new ArrayCollection(); 
     // some logic here if you need it 
    } 
} 

/** @Entity */ 
class Service 
{ 
    /** @Id @Column(type="integer") @GeneratedValue */ 
    protected $id; 

    /** @Column(type="string) *§ 
    protected $name; 
} 

/** @Entity */ 
class TableDocumentService 
{ 
    /** @Id @ManyToOne(targetEntity="Document") */ 
    protected $document; 

    /** @Id @ManyToOne(targetEntity="Service") */ 
    protected $service; 

    /** @Column(type="integer") */ 
    protected $amount = 1; 

} 

我可以补充一点,我想,你可以在服务类中添加过其他一对多关联的文档所做的文档实体,像

/** @OneToMany(targetEntity="OrderItem", mappedBy="service") */ 
protected $tableDocumentService; 

@YoannCh的答案是正确的,但正确的注释是

对于文档实体:

/** 
* @ORM\Entity 
* @ORM\Table(name="Document") 
*/ 
class Document 
{ 
    /** 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue 
    */ 
    private $id; 

    /** 
    * @ORM\Column(type="string") 
    */ 
    private $name; 

    /** 
    * @ORM\OneToMany(
    * targetEntity="DocumentService", mappedBy="documentId") 
    */ 
    private $documentService; 
    //... 

服务耳鼻喉科两者均是:

/** 
* @ORM\Entity 
* @ORM\Table(name="service") 
*/ 
class Service 
{ 
    /** 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue 
    */ 
    private $id; 

    /** 
    * @ORM\Column(type="string") 
    */ 
    private $name; 

    /** 
    * @ORM\OneToMany(
    * targetEntity="DocumentService", mappedBy="serviceId", 
    * ) 
    */ 
    private $documentService; 
    // ... 

DocumentService实体(加入文件和服务之间表)是:

/** 
* @ORM\Entity 
* @ORM\Table(name="document_service") 
*/ 
class DocumentService 
{ 
    /** 
    * @ORM\ManyToOne(targetEntity="Document", inversedBy="documentService") 
    * @ORM\JoinColumn(name="document_id", referencedColumnName="id") 
    */ 
    private $documentId; 

    /** 
    * @ORM\ManyToOne(targetEntity="Service", inversedBy="documentService") 
    * @ORM\JoinColumn(name="company_id", referencedColumnName="id") 
    */ 
    private $serviceId; 

    /** 
    * @ORM\Column(type="integer", name="amonut") 
    */ 
    private $amonut; 

article讨论你曾与例如问了同样的问题

+1

注解只取决于您的进口(使用语句)。如果您按照以下方式导入ORM注释:使用Doctrine \ ORM \ Mapping作为ORM;'那么您的精确度是正确的。如果您将它们分开导入为'使用Doctrine \ ORM \ Mapping \ Entity,Doctrine \ ORM \ Mapping \ Id,Doctrine \ ORM \ Mapping \ Column,Doctrine \ ORM \ Mapping \ ManyToOne,Doctrine \ ORM \ Mapping \ OneToMany'使用 ; '为了更精确的进口,我的答案效果很好。 –