5

多対多のマッピングは、単純なシナリオでredbeanで簡単に使用できます。しかし、まったく同じオブジェクト間で複数の多対多のマッピングをどのように行うのでしょうか。

例:

私が達成したいのは、「フォロワー」と「フォロー」のツイッター/インスタグラムの設定と非常によく似た構造です。

// this c

$user = R::dispense('user');
$user2 = R::dispense('user');

// ..

//Usr1 follows user2
$user->sharedUser[] = $user2;

// user2 follows user1
$user2->sharedUser[] = $user1;

ここで、user1の観点から、フォロワーとフォローしているユーザーの両方をリストします。

ただし、データベース内のすべてのユーザーにクエリを実行してuser1を探すことなく、「フォロワー」を一覧表示することはできません。redbeanに複数の「共有」リストを作成する方法や、これらの特定のケースに対する適切な回避策はありますか、それともクエリの方法ですか?

4

1 に答える 1

6

これが機能することを証明するためにテストと一緒に使用するコードです:)

<?php
include_once 'rb.php';
R::setup();


//create users
$users = array();
foreach (array('arul', 'jeff', 'mugunth', 'vish') as $name) {
    $user = R::dispense('user');
    $user->name = $name;
    $user->follows = R::dispense('follows');
    //create variables with specified names ($arul, $jeff, etc)
    $$name = $user;
    $users[] = $user;
}

//set relationships
$arul->follows->sharedUser = array($jeff);
$mugunth->follows->sharedUser = array($jeff, $arul);
$vish->follows->sharedUser = array($arul, $mugunth);

R::storeAll($users);

//print relationships
$id = 1;
while (true) {
    echo "-----------------------------------\n";
    $u = R::load('user', $id++);
    if (!$u->id) break;
    echo "$u->name follows " . count($u->follows->sharedUser) . " user(s) \n";
    if ($u->follows) {
        foreach ($u->follows->sharedUser as $f) {
            echo "    - $f->name \n";
        }
    }
    echo "\n$u->name is followed by "
        . R::getCell("SELECT COUNT(*) FROM follows_user WHERE user_id = $u->id")
        . " user(s) \n";
    foreach ($u->sharedFollows as $f) {
        $follower = array_shift($f->ownUser);
        echo "    - $follower->name \n";
    }
}

/* echos the following
-----------------------------------
jeff follows 0 user(s)

jeff is followed by 2 user(s)
    - arul
    - mugunth
-----------------------------------
arul follows 1 user(s)
    - jeff

arul is followed by 2 user(s)
    - mugunth
    - vish
-----------------------------------
mugunth follows 2 user(s)
    - jeff
    - arul

mugunth is followed by 1 user(s)
    - vish
-----------------------------------
vish follows 2 user(s)
    - arul
    - mugunth

vish is followed by 0 user(s)
-----------------------------------
*/
于 2012-11-06T11:43:20.403 に答える