2

问:使用 Datamapper ORM 时,如何为邻接列表设置模型。有人经历过吗?例如,表类别(id、name、has_parent_category_id)。感谢您的关注!

示例表,

Tbl Category

id | name | has_parent_category_id
1  | catA | 0
2  | catB | 0
3  | catC | 1
4  | catD | 2
5  | catE | 3

这些文档在http://datamapper.wanwizard.eu/pages/advancedrelations.html中,我发现了以下“自我关系”。我不确定这是否是正确的方法!我正在测试它。

如果有人对邻接列表、codeigniters Datamapper ORM 有经验,并且介意留下一个关于如何做到这一点的实际示例,我将不胜感激!

谢谢你的时间!

4

1 回答 1

0

(注意:自从我将统治权交给 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

于 2011-07-30T21:26:47.317 回答