包含具有2个主键的ManyToOne对象的实体

时间:2013-01-04 08:37:37

标签: symfony doctrine doctrine-orm

我遇到了一个我不确定如何实施的问题。我正在尝试实现基于Web的录音机。目前我有3个实体用于此部分。 Book PageRecording

每个页面都映射到如此的书:

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 个答案:

答案 0 :(得分: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.这样就不会在数据库中复制数据了。