2016-11-09 113 views
0

看看下面的模型:學說越權關係

class Team 

    /** 
    * @id 
    * @ManyToOne(targetEntity="Person") 
    * @JoinColumn(name="id_manager", referencedColumnName="id") 
    */ 
    protected $manager; 

    /** 
    * @id 
    * @ManyToOne(targetEntity="Stadium") 
    * @JoinColumn(name="stadium", referencedColumnName="stadium") 
    */ 
    protected $stadium; 

當我使用數組hidration查詢團隊我做的:

$qb->select(['a', 'b', 'c']); 
$qb->from(Team::class, 'a'); 
$qb->leftJoin('a.manager', 'b'); 
$qb->leftJoin('a.stadium', 'c'); 

$teams = $qb->getQuery()->getArrayResult(); 

對於每個團隊結構是這樣的:

[ 
    "id_manager": 3, 
    "manager": [ 
     "id": 3, 
     "name": "Billy" 
    ], 
    "stadium": 8 
] 

看看「manager」是如何作爲一個數組加載(如預期的那樣),而是「體育場」。在第一個符號看起來,如果關係字段與保留列值的列名稱相同。有沒有辦法避免這種情況,而不重命名字段$stadium列?

PS:$qb->select(['a', 'b', 'c as stadium2']);沒有工作。

編輯我注意到,如果我刪除@id註釋,我會得到預期的結構。

回答

0

那麼經理的身份證應該是團隊的主要關鍵?所以你的主鍵同時是一個外鍵?不建議這樣做。

我提出一個團隊的主鍵,它是獨立的,並且與第二個屬性中的管理者有關係。

如果您在結果中需要經理的ID,您可以實現例如在您的自定義存儲庫中,或者通過您的Team類中沒有映射到ORM的附加屬性及其吸氣劑。

+0

我完全同意'主鍵是一個外鍵同時不推薦'。但我正在一個統一數據庫下工作,主鍵是以這種方式分配的 – manix

+0

但是,您可以通過在Team和Manager之間建立OneToOne關係來解決這個問題。說實話,我不知道你的設置如何工作。唯一我能想象的是原始團隊根本沒有主鍵。 – LBA

+0

問題是,以某種方式,id關係不能作爲關係加載,而是作爲字段加載。 – manix