Я пытаюсь создать CMS с Nodes
в качестве основной модели. Каждый Node
belongsTo
есть 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
Теперь - если я запрошу телешоу и содержу его узлы Актера:
$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 -> Джордж Клуни.
Но что, если я хочу отменить все шоу, в которых участвует Джордж Клуни?
$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
),
)
)
));
Это не работает, потому что он ищет идентификатор Джорджа Клуни в поле «node_id», а идентификатор ER — в поле «associated_node_id», хотя на самом деле они перевернуты.
Единственное решение, о котором я подумал, - это сохранить две строки для КАЖДОЙ ассоциации. Но это кажется излишеством. Но тогда мне нужно придумать что-то нестандартное, что гарантирует синхронизацию каждого дубликата с другим каждый раз, когда ассоциация сохраняется или удаляется... и т. д. - и это похоже на большую банку червей.
Есть что-то, что мне не хватает?