(注意:自从我将统治权交给 WanWizard 以来,我并没有太多使用 DataMapper,但我维护 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