2013-01-04 38 views
0

我遇到了一个我并不确定如何实现的问题。我正在尝试实现基于网络的录音机。目前我有3个实体用于这部分。 BookPageRecording包含具有2个主键的ManyToOne对象的实体

每一页映射到一本书,像这样:

class Page 
{ 
    /** 
    * @ORM\Id 
    * @ORM\ManyToOne(targetEntity="Book") 
    * @ORM\JoinColumn(name="bookID", referencedColumnName="id") 
    */ 
    protected $bookID; 

    /** 
    * @ORM\Id 
    * @ORM\Column(name="pageNumber", type="integer") 
    */ 
    protected $pageNumber; 

什么我卡上是每个页面可以有多个录音,我不知道,如果每个记录需要也映射到一本书,因为每个页面已经映射到一本书。

class Recording 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(name="recordingID",type="integer") 
    * @ORM\GeneratedValue(strategy="IDENTITY") 
    */ 

    protected $recordingID; 

    /** 
    * @ORM\ManyToOne(targetEntity="Page") 
    * @ORM\JoinColumn(name="pageID", referencedColumnName="pageNumber") 
    */ 
    protected $pageID; 

回答

1

你不需要录音映射到相应的实体书,因为它会继承其映射到页面实体这种关系。如果你有一个记录实体,你会想检索其书的实体,您将能够一起做的

$oRecording = $this->_em->find($recording_id); 
$oBook = $oRecording->getPage()->getBook(); 

线在数据库中的东西,你应该得到的页表

ID | page_number | book_id
----------------
1 | 3 | 12
2 | 4 | 15

和记录表

ID | page_id
----------------
1 | 2
2 | 2

因此,记录2的page_id = 2,因此book_id 15.这样你就不会在数据库中复制数据。

+0

但它将如何存储在数据库中?只是好奇,因为在页表中,BookID和PageNumber是主键。 – ChaoticLoki

+0

问题在于现在,我的页面表可以是这样的,pagenumber 1,book id 12,pagenumber 1,book id 15. – ChaoticLoki

+0

啊我现在明白了,最简单的(也是我认为更好的)解决方案是通过使pagenumber不是页面实体的主键,而是使用无意义的标识符并为page_number创建单独的受保护变量。我更新了数据库方案。 – Pankrates

相关问题