Gathers labels from beans. This function loops through the beans,
collects the values of the name properties of each individual bean
and stores the names in a new array. The array then gets sorted using the
default sort function of PHP (sort).
public static gatherLabels ( array $beans ) : array | ||
$beans | array | list of beans to loop |
리턴 | array |
/** * Test basic labels. * * @return void */ public function testLabels() { testpack('Test Labels'); $meals = R::dispenseLabels('meal', array('meat', 'fish', 'vegetarian')); asrt(is_array($meals), TRUE); asrt(count($meals), 3); foreach ($meals as $m) { asrt($m instanceof OODBBean, TRUE); } $listOfMeals = implode(',', R::gatherLabels($meals)); asrt($listOfMeals, 'fish,meat,vegetarian'); }
/** * Test ENUM functionality offered by Label Maker. * * @return void */ public function testENUM() { testpack('test ENUM'); $coffee = R::dispense('coffee'); $coffee->taste = R::enum('flavour:mocca'); //did we create an enum? asrt(implode('', R::gatherLabels(R::enum('flavour'))), 'MOCCA'); R::store($coffee); $coffee = $coffee->fresh(); //test enum identity check - with alias asrt($coffee->fetchAs('flavour')->taste->equals(R::enum('flavour:mocca')), TRUE); asrt($coffee->fetchAs('flavour')->taste->equals(R::enum('flavour:banana')), FALSE); //now we have two flavours asrt(R::count('flavour'), 2); asrt(implode(',', R::gatherLabels(R::enum('flavour'))), 'BANANA,MOCCA'); $coffee->flavour = R::enum('flavour:mocca'); R::store($coffee); //same results, can we have multiple flavours? asrt($coffee->fetchAs('flavour')->taste->equals(R::enum('flavour:mocca')), TRUE); asrt($coffee->fetchAs('flavour')->taste->equals(R::enum('flavour:banana')), FALSE); asrt($coffee->flavour->equals(R::enum('flavour:mocca')), TRUE); //no additional mocca enum... asrt(R::count('flavour'), 2); $drink = R::dispense('drink'); $drink->flavour = R::enum('flavour:choco'); R::store($drink); //now we have three! asrt(R::count('flavour'), 3); $drink = R::load('drink', $drink->id); asrt($drink->flavour->equals(R::enum('flavour:mint')), FALSE); asrt($drink->flavour->equals(R::enum('flavour:choco')), TRUE); asrt(R::count('flavour'), 4); //trash should not affect flavour! R::trash($drink); asrt(R::count('flavour'), 4); }
/** * Test many different scenarios with self referential * many-to-many relations. * * @return void */ public function testSelfReferentialCRUD() { R::nuke(); $buddies = R::dispense('buddy', 4); $buddies[0]->name = 'A'; $buddies[1]->name = 'B'; $buddies[2]->name = 'C'; $buddies[3]->name = 'D'; $buddies[0]->sharedBuddyList = array($buddies[1], $buddies[2]); $buddies[3]->sharedBuddyList = array($buddies[2]); R::storeAll($buddies); $buddies[0] = $buddies[0]->fresh(); asrt(count($buddies[0]->sharedBuddyList), 2); //does this yield valid combinations - cross relations / self ref n-m //need to symmetric.... $names = R::gatherLabels($buddies[0]->sharedBuddyList); sort($names); $names = implode(',', $names); asrt($names, 'B,C'); unset($buddies[0]->sharedBuddy); R::storeAll($buddies); $buddies[0] = $buddies[0]->fresh(); asrt(count($buddies[0]->sharedBuddyList), 2); $buddies[3] = $buddies[3]->fresh(); asrt(count($buddies[3]->sharedBuddyList), 1); $names = R::gatherLabels($buddies[3]->sharedBuddyList); sort($names); $names = implode(',', $names); asrt($names, 'C'); $buddies[2] = $buddies[2]->fresh(); asrt(count($buddies[2]->sharedBuddyList), 2); $names = R::gatherLabels($buddies[2]->sharedBuddyList); sort($names); $names = implode(',', $names); asrt($names, 'A,D'); $buddies[1] = $buddies[1]->fresh(); asrt(count($buddies[1]->sharedBuddyList), 1); $names = R::gatherLabels($buddies[1]->sharedBuddyList); sort($names); $names = implode(',', $names); asrt($names, 'A'); //Can we add one? $buddies[1]->sharedBuddyList[] = R::dispense('buddy')->setAttr('name', 'E'); R::store($buddies[1]); $buddies[0] = $buddies[0]->fresh(); asrt(count($buddies[0]->sharedBuddyList), 2); $names = R::gatherLabels($buddies[0]->sharedBuddyList); sort($names); $names = implode(',', $names); asrt($names, 'B,C'); $buddies[1] = $buddies[1]->fresh(); asrt(count($buddies[1]->sharedBuddyList), 2); $names = R::gatherLabels($buddies[1]->sharedBuddyList); sort($names); $names = implode(',', $names); asrt($names, 'A,E'); $all = R::find('buddy'); asrt(count($all), 5); foreach ($buddies[1]->sharedBuddy as $buddy) { if ($buddy->name === 'E') { $buddyE = $buddy; } } asrt(isset($buddyE), TRUE); asrt($buddyE->name, 'E'); //can we update? foreach ($buddies[0]->sharedBuddy as $buddy) { if ($buddy->name === 'C') { $buddy->name = 'C2'; } } R::store($buddies[0]); $buddies[0] = $buddies[0]->fresh(); asrt(count($buddies[0]->sharedBuddyList), 2); $names = R::gatherLabels($buddies[0]->sharedBuddyList); sort($names); $names = implode(',', $names); asrt($names, 'B,C2'); $buddies[2] = $buddies[2]->fresh(); asrt(count($buddies[2]->sharedBuddyList), 2); $names = R::gatherLabels($buddies[2]->sharedBuddyList); sort($names); $names = implode(',', $names); asrt($names, 'A,D'); //can we delete? foreach ($buddies[0]->sharedBuddyList as $id => $buddy) { if ($buddy->name === 'B') { unset($buddies[0]->sharedBuddyList[$id]); } } R::store($buddies[0]); $buddies[0] = $buddies[0]->fresh(); asrt(count($buddies[0]->sharedBuddyList), 1); $names = R::gatherLabels($buddies[0]->sharedBuddyList); sort($names); $names = implode(',', $names); asrt($names, 'C2'); $buddies[1] = $buddies[1]->fresh(); asrt(count($buddies[1]->sharedBuddyList), 1); $names = R::gatherLabels($buddies[1]->sharedBuddyList); sort($names); $names = implode(',', $names); asrt($names, 'E'); asrt(R::count('buddy'), 5); asrt(R::count('buddyBuddy'), 3); $buddies[3] = $buddies[3]->fresh(); asrt(count($buddies[3]->sharedBuddyList), 1); $names = R::gatherLabels($buddies[3]->sharedBuddyList); sort($names); $names = implode(',', $names); asrt($names, 'C2'); $buddies[2] = $buddies[2]->fresh(); asrt(count($buddies[2]->sharedBuddyList), 2); $names = R::gatherLabels($buddies[2]->sharedBuddyList); sort($names); $names = implode(',', $names); asrt($names, 'A,D'); $buddyE = $buddyE->fresh(); asrt(count($buddyE->sharedBuddyList), 1); $names = R::gatherLabels($buddyE->sharedBuddyList); sort($names); $names = implode(',', $names); asrt($names, 'B'); //can we access linked_by -- o dear mysql again! cant have alias in WHERE! if ($this->currentlyActiveDriverID === 'mysql') { $buddyE = $buddyE->fresh(); asrt(count($buddyE->with(' HAVING linked_by > 0 ')->sharedBuddyList), 1); $buddyE = $buddyE->fresh(); asrt(count($buddyE->with(' HAVING linked_by < 0 ')->sharedBuddyList), 0); } //even postgres sucks. Only SQLite knows how to handle this. //I dont give a f**k whether it's an SQL standard or not, it should just work. if ($this->currentlyActiveDriverID === 'sqlite') { $buddyE = $buddyE->fresh(); asrt(count($buddyE->withCondition(' linked_by > 0 ')->sharedBuddyList), 1); $buddyE = $buddyE->fresh(); asrt(count($buddyE->withCondition(' linked_by < 0 ')->sharedBuddyList), 0); } $buddyE = $buddyE->fresh(); asrt(count($buddyE->withCondition(' buddy_buddy.buddy_id > 0 AND buddy_buddy.buddy2_id > 0 ')->sharedBuddyList), 1); $buddyE = $buddyE->fresh(); asrt(count($buddyE->withCondition(' buddy_buddy.buddy_id < 0 AND buddy_buddy.buddy2_id < 0 ')->sharedBuddyList), 0); }
/** * Fast track link block code should not affect self-referential N-M relations. * * @return void */ public function testFastTrackRelations() { testpack('Test fast-track linkBlock exceptions'); list($donald, $mickey, $goofy, $pluto) = R::dispense('friend', 4); $donald->name = 'D'; $mickey->name = 'M'; $goofy->name = 'G'; $pluto->name = 'P'; $donald->sharedFriend = array($mickey, $goofy); $mickey->sharedFriend = array($pluto, $goofy); $mickey->sharedBook = array(R::dispense('book')); R::storeAll(array($mickey, $donald, $goofy, $pluto)); $donald = R::load('friend', $donald->id); $mickey = R::load('friend', $mickey->id); $goofy = R::load('friend', $goofy->id); $pluto = R::load('friend', $pluto->id); $names = implode(',', R::gatherLabels($donald->sharedFriend)); asrt($names, 'G,M'); $names = implode(',', R::gatherLabels($goofy->sharedFriend)); asrt($names, 'D,M'); $names = implode(',', R::gatherLabels($mickey->sharedFriend)); asrt($names, 'D,G,P'); $names = implode(',', R::gatherLabels($pluto->sharedFriend)); asrt($names, 'M'); // Now in combination with with() conditions... $donald = R::load('friend', $donald->id); $names = implode(',', R::gatherLabels($donald->withCondition(' name = ? ', array('M'))->sharedFriend)); asrt($names, 'M'); // Now in combination with with() conditions... $donald = R::load('friend', $donald->id); $names = implode(',', R::gatherLabels($donald->with(' ORDER BY name ')->sharedFriend)); asrt($names, 'G,M'); // Now counting $goofy = R::load('friend', $goofy->id); asrt((int) $goofy->countShared('friend'), 2); asrt((int) $donald->countShared('friend'), 2); asrt((int) $mickey->countShared('friend'), 3); asrt((int) $pluto->countShared('friend'), 1); }