2012-09-22 7 views
5

Viele-zu-viele-Zuordnungen sind in redbean mit einfachen Szenarien einfach zu verwenden. Aber wie macht man mehrere Viele-zu-Viele-Kartierungen zwischen genau demselben Objekt?Redbean, mehrere Viele-zu-Viele mit demselben Objekt

Beispiel:

Was will ich in der Struktur zu erledige ist sehr ähnlich dem Twitter/instagram Einrichtung von „Anhängern“ und „nach“

// this c 

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

// .. 

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

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

Jetzt möchte ich, aus benutzer1 Perspektive , listet sowohl die Follower als auch die folgenden Benutzer auf.

Allerdings kann ich die "Follower" nicht auflisten, ohne alle Benutzer in der Datenbank abzufragen und nach user1 zu suchen. Gibt es eine Möglichkeit, mehrere "gemeinsame" Listen in redbean oder eine nette Problemumgehung für diese speziellen Fälle zu haben, oder ist die Abfrage der Weg?

Antwort

6

Hier ist der Code, den ich mit dem Test verwenden zusammen zu beweisen, dass es :)

<?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) 
----------------------------------- 
*/ 
arbeitet
Verwandte Themen