我正在尝试构建一个以 CMSNodes
为主要模型的内容。每个Node
belongsTo
aNodeType
和 everyNode
都可以与 any/every other 相关Node
。
所以 - 认为这需要HABTM:
//Node model
public $hasAndBelongsToMany = array(
'AssociatedNode' => array(
'className' => 'Node',
'foreignKey' => 'node_id',
'associationForeignKey' => 'associated_node_id',
'joinTable' => 'node_associations'
)
);
问题是,似乎唯一可行的方法是每个关联都有两行。
只有一个关联行的示例:
节点
- 急诊室 (id=1)
- 乔治克鲁尼 (id=2)
连接表中的一行描述了这两个节点之间的关系:
- 'node_id' = 1
- '关联节点ID' = 2
现在 - 如果我查询 TV Shows 并包含它的 Actor 节点:
$nodes = $this->Node->find('all', array(
'conditions' => array(
'Node.node_type_id' => '645' //tv shows
),
'contain' => array(
'AssociatedNode' => array(
'conditions' => array(
'AssociatedNode.node_type_id' => '239' //actors
),
)
)
));
这行得通,我得到 ER -> George Clooney。
但是 - 如果我想取消所有乔治克鲁尼参加的节目怎么办?
$nodes = $this->Node->find('all', array(
'conditions' => array(
'Node.node_type_id' => '239' //actors
),
'contain' => array(
'AssociatedNode' => array(
'conditions' => array(
'AssociatedNode.node_type_id' => '645' //tv shows
),
)
)
));
这不起作用,因为它正在寻找 George Clooney 的 ID 在 'node_id' 字段中,而 ER 的 ID 在 'associated_node_id' 字段中 - 而实际上它们是相反的。
我想到的唯一解决方案是为每个关联保留两行。但这似乎有些矫枉过正。但是随后我必须想出某种自定义的东西,以确保每次保存或删除关联时都使每个副本与另一个副本保持同步......等等 - 这似乎是一大罐蠕虫。
有什么我想念的吗?