2013-12-09 2 views
2

symfony2로 첫 번째 애플리케이션을 구축하고 있습니다. 엔티티들로이 데이터베이스 레이아웃을 만들고 싶습니다.Symfony2 엔티티 관계 (콜룸 포함)

# 문서

가 document_ID | INT | 인공 지능 | PK

document_name | STRING

서비스 | 관계 MANY2MANY

...

# 서비스

SERVICE_ID | INT | 인공 지능 | PK

service_name | STRING

...

* #의 _table_document_service *

가 document_ID | INT

service_id | INT

금액 | INT | DEFAULT 1

엔티티 문서 및 서비스를 만드는 것은 문제가되지 않습니다. 문서 및 서비스 간의 관계를 만들려면 나는이 하나처럼 ManyToMany-관계 사용합니다 :

/** 
* @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; 

을하지만 조인 테이블도 금액라는 컬럼이되어야한다고합니다. 내가 어떻게 할 수 있니?

답변

1

관계에 추가 필드를 추가하려는 경우, 더 이상 관계가 아니지만 명확하게 - "designly"말하는 - 연관 객체입니다. 당신이 당신의 "테이블 문서 서비스"테이블에서 원하는 따라서

는 이렇게 서비스

문서 ------- 표 문서 서비스 -------- 같은 것입니다 문서 ---- 표 문서 서비스 및 표 문서 서비스 -------- 서비스

표 문서의 "복합 키"의 종류 사이

많은 일에 대한 연관 그래서 2 가지 의미 이러한 연결을 기반으로하는 서비스 엔티티 (primarykey th en은 이러한 객체 들간의 관계를 종합 한 것입니다.

다음은 몇 가지 예입니다. as you can see in the official doctrine 2 documentation 다음과 같이 복합 키를 사용하여 manytoone을 기반으로 한 제휴를 할 수 있습니다.

편집 : 여기에 몇 가지 코드가 있으며, 예를 따라 가려고합니다.사이먼이 문서 엔티티처럼

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; 
1

@YoannCh의 대답처럼, Service 클래스에 뭔가를 너무 다른 OneToMany 연결을 추가 할 수 있습니다 올바른하지만 올바른 주석이 문서 엔티티에 대한

입니다 :

/** 
* @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="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\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 법인이다 (문서 및 서비스 사이에 테이블을 가입) (문장 사용). 'Doctrine \ ORM \ Mapping을 ORM으로 사용하십시오 '와 같이 ORM 주석을 가져 오는 경우 정확도가 정확합니다. Doctrine \ ORM \ Mapping \ Entity, Doctrine \ ORM \ Mapping \ Id, Doctrine \ ORM \ Mapping \ Column, Doctrine \ ORM \ Mapping \ ManyToOne, Doctrine \ ORM \ Mapping \ OneToMany를 사용하십시오. '보다 정확한 수입을 위해서는 제 답변이 잘 작동합니다. –