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讨论你曾与例如问了同样的问题
注解只取决于您的进口(使用语句)。如果您按照以下方式导入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'使用 ; '为了更精确的进口,我的答案效果很好。 –