2

Q: Datamapper ORM を使用する場合、Adjacency Lists のモデルを設定する方法を教えてください。経験した人いますか?たとえば、テーブル カテゴリ ( 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にあり、次の「Self Relationships」を見つけました。これが正しい方法かどうかはわかりません。私はそれをテストしています。

誰かが隣接リストの経験があり、Datamapper ORM をコード化しており、これを行う方法に関する実用的な例を 1 つ残していただければ幸いです。

御時間ありがとうございます!

4

1 に答える 1

0

(注: WanWizard に管理を渡して以来、DataMapper はあまり使用していませんが、かなり長い間 DMZ を維持していました。)

考えられる解決策は 2 つあります。

1) 任意の 2 つの頂点が 1 つの共通エッジしか持てないと仮定する

頂点ペアごとに 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 では関係タイプごとに 2 つのオブジェクトを複数回関連付けることができないためです。

この例が必要な場合は、お知らせください。何かを書くか、http://datamapper.wanwizard.eu/pages/troubleshooting.html#Relationships.NtoM をチェックしてください

于 2011-07-30T21:26:47.317 に答える