2016-02-29 26 views
1

我使用與學說實體Symfony2的,我有下一個問題:主義 - 複合標識

My DB

我知道我可以解決這個問題把一個ID爲「club_has_torneo」和車削它變成了一個實體,但對我來說,創建一個實體看起來像是不應該做的事情。所以我想知道是否有辦法解決這個問題,或者如果我必須做我認爲必須做的事。

預先感謝您。

回答

1

我認爲最好的解決方案的確是爲您的club_has_torneo表製作一個實體。這ClubHasTorneo實體有club_idtorneo_idas composite keys並持有的擁有方一多到你的很多ClubHasTorneo實體和Nadador實體之間關係。這種關係可以通過使用3個鍵的連接表來完成。請查看下面的代碼,瞭解如何做到這一點。

您的數據庫計劃看起來完全像您提取它。
ClubHasTorneo實體將是這個樣子:

<?php 

namespace Application\Entity; 

use Application\Entity\Club; 
use Application\Entity\Torneo; 
use Application\Entity\Nadador; 
use Doctrine\Common\Collections\Collection; 
use Doctrine\Common\Collections\ArrayCollection; 

/** 
* @ORM\Entity 
* @ORM\Table(name="club_has_torneo") 
*/ 
class ClubHasTorneo 
{ 
    /** MANY-TO-ONE BIDIRECTIONAL, OWNING SIDE 
    * @var Club 
    * @ORM\Id 
    * @ORM\ManyToOne(targetEntity="Application\Entity\Club", inversedBy="clubHasTorneos", cascade={"persist"}) 
    * @ORM\JoinColumn(name="club_id", referencedColumnName="id") 
    */ 
    protected $club; 

    /** MANY-TO-ONE BIDIRECTIONAL, OWNING SIDE 
    * @var Torneo 
    * @ORM\Id 
    * @ORM\ManyToOne(targetEntity="Application\Entity\Torneo", inversedBy="clubHasTorneos") 
    * @ORM\JoinColumn(name="torneo_id", referencedColumnName="id") 
    */ 
    protected $torneo; 

    /** MANY-TO-MANY BIDIRECTIONAL, OWNING SIDE 
    * @var Collection 
    * @ORM\ManyToMany(targetEntity="Application\Entity\Nadador", inversedBy="clubHasTorneos") 
    * @ORM\JoinTable(name="club_has_torneo_has_nadador", 
    *  joinColumns={ 
    *   @ORM\JoinColumn(name="club_id", referencedColumnName="club_id"), 
    *   @ORM\JoinColumn(name="torneo_id", referencedColumnName="torneo_id") 
    *  }, 
    *  inverseJoinColumns={ 
    *   @ORM\JoinColumn(name="nadador_id", referencedColumnName="id") 
    *  } 
    *) 
    */ 
    protected $natadors; 

    public function __construct() 
    { 
     $this->natadors = new ArrayCollection(); 
    } 

    // setters and getters 
} 
+0

我不是數據庫專家,但是您確定這是建立數據庫關係的更好解決方案嗎?我的意思是,這種設計不會爲俱樂部 - 感恩關係添加不必要的重複,當爲一個單一的俱樂部 - 樂隊組合添加多個納塔多行時? – ejuhjav

+1

@ejuhjav這是一對一的,所以你不能在這個解決方案中有多個自然人。如果你想要多個自然人,你需要在ClubHasTorneo和Natador之間多對多。我可以更新我的答案。 – Wilt

+0

@ejuhjav我更新了我的答案 – Wilt

1

我5分錢

如果你希望你的實現相匹配的繪製表結構,然後(在我看來),你需要創建一個實體出來的'club_has_torneo'表(對於'club_has_torneo_has_matador'你不需要)。

基本原理是,如果您嘗試在不創建實體的情況下實現此目的,則需要創建實體關聯,以便'natador'表直接引用'club'和'torneo' - 在這種情況下,實際的數據庫關係將不再與您繪製的表格關係匹配(即natador與'club_has_torneo'表格沒有關係)。

2

我想我會提交我自己的兩美分價值。

ORM代表對象關係映射器。基本思想是找出如何映射對象而不用擔心數據庫模式太多。所以你有三個領域模型實體:torneo,club和nadador。大。弄清楚你的應用程序如何使用這些實體。不要擔心這些關係最終會被儲存起來。

一旦你有一個工作的領域模型,然後擔心持久性。三個領域實體明確地映射到三個學說實體。就這些關係而言,我個人並不喜歡複合主鍵。我認爲他們只是增加了一點價值而使事情複雜化。所以我會爲你的兩個表創建Doctrine實體,並給他們自己的主數據庫ID。

請注意,這些是主義實體不是實體。你的應用程序代碼根本不需要處理這些關係主義實體。所以,在我看來

創建一個實體看起來喜歡的事,不應該做

在這裏並不適用。這只是一個持久性細節。

+0

我真的會考慮到這一點,謝謝你的建議。 – 8370