1

EntitiesTable雙向belongsToMany協會有一個belongsToMany協會與自身:上同型號

class EntitiesTable extends AppTable 
{ 
    public function initialize(array $config) { 
     parent::initialize($config); 

     $this->belongsTo('Users'); 
     $this->hasMany('Information'); 
     $this->belongsToMany('LinkedEntities', array(
      'className' => 'Entities', 
      'through' => 'Links', 
      'foreignKey' => 'from_id', 
      'targetForeignKey' => 'to_id' 
     )); 
     $this->belongsToMany('Tags'); 
    } 
} 

然而,該協會只能在一個方向。當表links只包含條目[from_id: 1, to_id: 2]時,$this->Entities->findById(1)->contain('LinkedEntities')正確地提取鏈接的實體,但$this->Entities->findById(2)->contain('LinkedEntities')沒有。

一個解決方案是複製表links中的每個條目並且交換from_idto_id,但這不是期望的。我非常想要一個belongsToMany協會,將from_id視爲foreignKeyto_id視爲targetForeignKey,反之亦然。

怎樣才能實現一個雙向的belongsToMany自我關聯?

爲例

考慮以下圖狀網絡:

graph

每個點具有id也許一些附加信息(如標題或座標)和被存儲在表entities

現在點之間的連接可以使用表links表示:

from_id  to_id 
1   2 
1   4 
1   6 
2   3 
3   5 
3   7 
4   5 
4   6 
5   7 

注意,每個連接只存在一次,1-2也可以同樣被存儲爲2-1,方向從 - 到無關緊要。

現在,如果我想獲得所有連接到節點1的節點,我可以用下面的查詢:

SELECT * FROM entities WHERE id IN (
    SELECT to_id FROM links WHERE from_id = 1 
) OR id IN (
    SELECT from_id FROM links WHERE to_id = 1 
) 

請參閱多麼容易?因爲連接是雙向的,所以我只需確保檢查兩個方向。

我想在CakePHP中映射這個關聯。我知道這可能是目前不可能的,這就是爲什麼我打開issue in the CakePHP github

+0

相關問題裏面:http://stackoverflow.com/q/20832098/2580794該解決方案有僅適用於舊版本的CakePHP的,因爲選項'finderQuery'移除。 –

+0

嘗試通過$ id查找實體,並向可包含的LinkedEntities添加條件WHERE is from_id = $ id或to_id = $ id http://book.cakephp.org/3.0/en/orm/retrieving-data-and-resultsets。 html#傳遞條件 - 包含 – Salines

+0

添加附加條件將僅進一步限制鏈接的實體,因爲生成的查詢仍然需要to_id爲$ id。 –

回答

0

這有幫助嗎?

$this->belongsToMany('LinkedEntities', [ 
    'className' => 'Entities', 
    'through' => 'links', 
    'conditions' => [ 
     'OR' => [ 
       'AND' =>['Links.from_id = LinkedEntities.id', 'Links.to_id = Entities.id'], 
       'AND' => ['Links.to_id = LinkedEntities.id', 'Links.from_id = Entities.id'] 
      ], 
    ], 
]); 

將這個EntitiesTable