【发布时间】:2012-09-01 22:42:08
【问题描述】:
我正在尝试构建一个以Nodes 为主要模型的CMS。每个NodebelongsTo 一个NodeType,每个Node 都可以与任何/每个其他Node 相关。
所以 - 认为这需要 HABTM:
//Node model
public $hasAndBelongsToMany = array(
'AssociatedNode' => array(
'className' => 'Node',
'foreignKey' => 'node_id',
'associationForeignKey' => 'associated_node_id',
'joinTable' => 'node_associations'
)
);
问题是,它的唯一工作方式似乎是每个关联有两行。
只有一个关联行的示例:
节点
- ER (id=1)
- 乔治克鲁尼 (id=2)
连接表中的一行描述了这两个节点之间的关系:
- 'node_id' = 1
- 'associated_node_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”字段中 - 而实际上它们是相反的。
我想到的唯一解决方案是为每个关联保留两行。但这似乎有点矫枉过正。但是随后我必须想出某种自定义的东西,以确保每次保存或删除关联时都使每个副本与另一个副本保持同步......等等 - 这似乎是一大罐蠕虫。
我有什么遗漏吗?
【问题讨论】:
-
对我来说听起来像是一种树行为:D
标签: cakephp has-and-belongs-to-many cakephp-2.1