2012-05-31 81 views
1

我想鏈接一些對象。想象一下,你有Person表與這些記錄:Doctrine2中的多對多,單向,自引用關聯

  • 奧巴馬
  • 奧巴馬奧巴馬
  • 巴拉克·侯賽因·奧巴馬

正如你可以看到它是一個同一個人。我想有一個存儲替代人的聯盟。例如,對於人與ID = 1和NAME =奧巴馬linkedPersons應該是這樣的:

linkedPersons: 
    Obama Barack 
    Barack Hussein Obama 
    (optionally with Barack Obama itself) 

恕我直言應該多到很多,單向,自引用的關聯,但我不知道如何實現這樣的聯繫。

+0

有一個在雙向例如[文檔](http://docs.doctrine-project.org/projects/doctrine-orm/en/2.1/reference/association-mapping.html#many-to-many -self-參考)。它可以成爲你的出發點。 –

+0

@MolecularMan這個例子在實體中使用2個字段,但我只想要一個。雖然我爲一個用戶添加了一些鏈接人員,但他們也可以在同一個字段中使用另一個人員。 –

+0

我想如果你刪除'$ friendsWithMe'和'inversedBy',它應該按照你想要的那樣工作。 –

回答

1

我認爲你可以做簡單的ManyToMany單向映射。關係只涉及兩個用戶。這會在數據庫中創建額外的記錄(A - > B和B - > A),但我認爲它應該按照您的要求工作。

<?php 
/** @Entity */ 
class User 
{ 
    /** 
    * @ManyToMany(targetEntity="User") 
    * @JoinTable(name="alternateUsers", 
    *  joinColumns={@JoinColumn(name="user_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@JoinColumn(name="alternate_user_id", referencedColumnName="id")} 
    *  ) 
    */ 
    private $alternateUsers; 

    public function __construct() { 
     $this->alternateUsers = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 

    public function addAlternateUser(User $user) { 
     $this->alternateUsers[] = $user; 
     $user->alternateUsers[] = $this; 
    } 
} 
+0

恐怕$ user(另一個)永遠不會持久。可能是因爲它沒有被表單修改。 –

+0

那麼,你可以堅持它在你的控制器。你必須以任何一種方式堅持你新創建的實體,不是嗎? 或者您可以配置爲通過此關係級聯持久操作。 @ManyToMany(targetEntity =「User」,cascade = {「persist」})。有關詳情,請訪問http://readthedocs.org/docs/doctrine-orm/en/latest/reference/working-with-associations.html?highlight=cascade#transitive-persistence-cascade-operations –