這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_id
和to_id
,但這不是期望的。我非常想要一個belongsToMany協會,將from_id
視爲foreignKey
和to_id
視爲targetForeignKey
,反之亦然。
怎樣才能實現一個雙向的belongsToMany自我關聯?
爲例
考慮以下圖狀網絡:
每個點具有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。
相關問題裏面:http://stackoverflow.com/q/20832098/2580794該解決方案有僅適用於舊版本的CakePHP的,因爲選項'finderQuery'移除。 –
嘗試通過$ id查找實體,並向可包含的LinkedEntities添加條件WHERE is from_id = $ id或to_id = $ id http://book.cakephp.org/3.0/en/orm/retrieving-data-and-resultsets。 html#傳遞條件 - 包含 – Salines
添加附加條件將僅進一步限制鏈接的實體,因爲生成的查詢仍然需要to_id爲$ id。 –