(Примечание: я не очень много использовал DataMapper с тех пор, как передал управление WanWizard, но довольно долго поддерживал DMZ.)
Я вижу два возможных решения:
1) Предполагая, что любые две вершины могут иметь только одно общее ребро
В случае одного ребра на пару вершин вам не нужно делать ничего особенного. Просто создайте новую стандартную самоотношения (т.е. именованную), чтобы представить связь:
$has_many = array(
'parent_category' => array(
'class' => 'category'
'other_field' => 'category'
),
'category' => array(
'other_field' => 'parent_category'
)
);
Затем создайте свой объединяющий стол следующим образом:
name: categories_parent_categories
columns: id | category_id | parent_category_id
Теперь вы можете легко сделать края такими:
$catA = new Category()
$catA->name = 'catA';
$catA->save();
$catB = new Category();
$catB->name = 'catB';
$catB->save();
$catA->save('parent_category', $catB);
// OR
$catA->save_parent_category($catB);
$catA->parent_category->get();
foreach($catA->parent_category as $parent) {
echo $parent->name;
}
См. http://datamapper.wanwizard.eu/pages/save.html#Advanced для получения дополнительной информации о сохранении этих видов отношений.
2) Предполагая, что вам нужно несколько ребер на вершину
Это гораздо более сложный пример, но в основном он включает создание выделенного объекта для представления отношений, поскольку DataMapper не позволяет двум объектам связываться более одного раза для типа отношений .
Если вам нужен этот пример, дайте мне знать, и я что-нибудь напишу, или зацените http://datamapper.wanwizard.eu/pages/troubleshooting.html#Relationships.NtoM