/** * Clears all associated beans. * * @param RedBean_OODBBean $bean * @param string $type type * * @return mixed */ public static function clearRelations(RedBean_OODBBean $bean, $type, RedBean_OODBBean $bean2 = null, $extra = null) { $r = self::$associationManager->clearRelations($bean, $type); if ($bean2) { self::associate($bean, $bean2, $extra); } return $r; }
/** * Tags a bean or returns tags associated with a bean. * If $tagList is NULL or omitted this method will return a * comma separated list of tags associated with the bean provided. * If $tagList is a comma separated list (string) of tags all tags will * be associated with the bean. * You may also pass an array instead of a string. * * Tag list can be either an array with tag names or a comma separated list * of tag names. * * @param RedBean_OODBBean $bean bean to be tagged * @param array|string $tagList a list of tags * * @return array */ public function tag(RedBean_OODBBean $bean, $tagList = NULL) { if (is_null($tagList)) { $tags = array(); $keys = $this->associationManager->related($bean, 'tag'); if ($keys) { $tags = $this->redbean->batch('tag', $keys); } $foundTags = array(); foreach ($tags as $tag) { $foundTags[] = $tag->title; } return $foundTags; } $this->associationManager->clearRelations($bean, 'tag'); $this->addTags($bean, $tagList); return $tagList; }
/** * Clears all associated beans. * Breaks all many-to-many associations of a bean and a specified type. * * @param RedBean_OODBBean $bean bean you wish to clear many-to-many relations for * @param string $type type of bean you wish to break associatons with * * @return void */ public static function clearRelations(RedBean_OODBBean $bean, $type) { self::$associationManager->clearRelations($bean, $type); }
/** * Test legacy methods, backward compatibility with removed * setAssoc function. * * @return void */ public function testBackwardCompat() { $toolbox = R::$toolbox; $adapter = $toolbox->getDatabaseAdapter(); $writer = $toolbox->getWriter(); $redbean = $toolbox->getRedBean(); $pdo = $adapter->getDatabase(); $rb = $redbean; $testA = $rb->dispense('testA'); $testB = $rb->dispense('testB'); $a = new RedBean_AssociationManager($toolbox); try { $a->related($testA, "testB"); pass(); } catch (Exception $e) { fail(); } $user = $redbean->dispense("user"); $user->name = "John"; $redbean->store($user); $page = $redbean->dispense("page"); $page->name = "John's page"; $redbean->store($page); $page2 = $redbean->dispense("page"); $page2->name = "John's second page"; $redbean->store($page2); $a = new RedBean_AssociationManager($toolbox); $a->associate($page, $user); asrt(count($a->related($user, "page")), 1); $a->associate($user, $page2); asrt(count($a->related($user, "page")), 2); // Can we fetch the assoc ids themselves? $pageKeys = $a->related($user, "page"); $pages = $redbean->batch("page", $pageKeys); $links = $redbean->batch("page_user", $a->related($user, "page", TRUE)); asrt(count($links), 2); // Confirm that the link beans are ok. $link = array_pop($links); asrt(isset($link->page_id), TRUE); asrt(isset($link->user_id), TRUE); asrt(isset($link->id), TRUE); $link = array_pop($links); asrt(isset($link->page_id), TRUE); asrt(isset($link->user_id), TRUE); asrt(isset($link->id), TRUE); $a->unassociate($page, $user); asrt(count($a->related($user, "page")), 1); $a->clearRelations($user, "page"); asrt(count($a->related($user, "page")), 0); $user2 = $redbean->dispense("user"); $user2->name = "Second User"; set1toNAssoc($a, $user2, $page); set1toNAssoc($a, $user, $page); asrt(count($a->related($user2, "page")), 0); asrt(count($a->related($user, "page")), 1); set1toNAssoc($a, $user, $page2); asrt(count($a->related($user, "page")), 2); $pages = $redbean->batch("page", $a->related($user, "page")); asrt(count($pages), 2); $apage = array_shift($pages); asrt($apage->name == "John's page" || $apage->name == "John's second page", TRUE); $apage = array_shift($pages); asrt($apage->name == "John's page" || $apage->name == "John's second page", TRUE); // Test save on the fly $page = $redbean->dispense("page"); $page2 = $redbean->dispense("page"); $page->name = "idless page 1"; $page2->name = "idless page 1"; $a->associate($page, $page2); asrt($page->id > 0, TRUE); asrt($page2->id > 0, TRUE); $idpage = $page->id; $idpage2 = $page2->id; $page = $redbean->dispense("page"); $page->name = "test page"; $id = $redbean->store($page); $user = $redbean->dispense("user"); $a->unassociate($user, $page); pass(); // No error $a->unassociate($page, $user); pass(); // No error $a->clearRelations($page, "user"); pass(); // No error $a->clearRelations($user, "page"); pass(); // No error $a->associate($user, $page); pass(); asrt(count($a->related($user, "page")), 1); asrt(count($a->related($page, "user")), 1); $a->clearRelations($user, "page"); pass(); // No error asrt(count($a->related($user, "page")), 0); asrt(count($a->related($page, "user")), 0); $page = $redbean->load("page", $id); pass(); asrt($page->name, "test page"); }
/** * Clears associations */ protected function clearRelations() { $this->associationManager->clearRelations($this->bean); }
$movies = $a2->related($movie1, "movie"); asrt(count($movies), 1); asrt((int) $movies[0], (int) $movieid2); $movies = $a2->related($movie2, "movie"); asrt(count($movies), 1); asrt((int) $movies[0], (int) $movieid); $genre = $redbean2->dispense("genre"); $genre->name = "western"; $a2->associate($movie, $genre); $movies = $a2->related($genre, "movie"); asrt(count($movies), 1); asrt((int) $movies[0], (int) $movieid); $a2->unassociate($movie, $genre); $movies = $a2->related($genre, "movie"); asrt(count($movies), 0); $a2->clearRelations($movie, "movie"); $movies = $a2->related($movie1, "movie"); asrt(count($movies), 0); //$pdo->setDebugMode(0); testpack("Test Table Prefixes"); R::setup("pgsql:host={$ini['pgsql']['host']} dbname={$ini['pgsql']['schema']}", $ini['pgsql']['user'], $ini['pgsql']['pass']); class MyTableFormatter implements RedBean_IBeanFormatter { public function formatBeanTable($table) { return "xx_{$table}"; } public function formatBeanID($table) { return "id"; }
/** * Clears all associated beans. * Breaks all many-to-many associations of a bean and a specified type. * Only breaks N-M relations. * * @warning not a preferred method, use $bean->shared = array() if possible. * * @param RedBean_OODBBean $bean bean you wish to clear many-to-many relations for * @param string $type type of bean you wish to break associations with * * @return void */ public function clearRelations(RedBean_OODBBean $bean, $type) { $this->associationManager->clearRelations($bean, $type); }
/** * Test self referential N-M relations (page_page). * * @return void */ public function testSelfReferential() { $toolbox = R::$toolbox; $adapter = $toolbox->getDatabaseAdapter(); $writer = $toolbox->getWriter(); $redbean = $toolbox->getRedBean(); $pdo = $adapter->getDatabase(); $a = new RedBean_AssociationManager($toolbox); $page = $redbean->dispense("page"); $page->name = "John's page"; $idpage = $redbean->store($page); $page2 = $redbean->dispense("page"); $page2->name = "John's second page"; $idpage2 = $redbean->store($page2); $a->associate($page, $page2); $ids = $a->related($page, "page"); asrt(count($ids), 1); asrt(intval(array_pop($ids)), intval($idpage2)); $ids = $a->related($page2, "page"); asrt(count($ids), 1); asrt(intval(array_pop($ids)), intval($idpage)); $page3 = $redbean->dispense("page"); $page3->name = "third"; $page4 = $redbean->dispense("page"); $page4->name = "fourth"; $a->associate($page3, $page2); $a->associate($page2, $page4); $a->unassociate($page, $page2); asrt(count($a->related($page, "page")), 0); $ids = $a->related($page2, "page"); asrt(count($ids), 2); asrt(in_array($page3->id, $ids), TRUE); asrt(in_array($page4->id, $ids), TRUE); asrt(in_array($page->id, $ids), FALSE); asrt(count($a->related($page3, "page")), 1); asrt(count($a->related($page4, "page")), 1); $a->clearRelations($page2, "page"); asrt(count($a->related($page2, "page")), 0); asrt(count($a->related($page3, "page")), 0); asrt(count($a->related($page4, "page")), 0); try { $a->associate($page2, $page2); pass(); } catch (RedBean_Exception_SQL $e) { fail(); } $pageOne = $redbean->dispense("page"); $pageOne->name = "one"; $pageMore = $redbean->dispense("page"); $pageMore->name = "more"; $pageEvenMore = $redbean->dispense("page"); $pageEvenMore->name = "evenmore"; $pageOther = $redbean->dispense("page"); $pageOther->name = "othermore"; set1toNAssoc($a, $pageOther, $pageMore); set1toNAssoc($a, $pageOne, $pageMore); set1toNAssoc($a, $pageOne, $pageEvenMore); asrt(count($a->related($pageOne, "page")), 2); asrt(count($a->related($pageMore, "page")), 1); asrt(count($a->related($pageEvenMore, "page")), 1); asrt(count($a->related($pageOther, "page")), 0); }
/** * Tests freezing the database. * After freezing the database, schema modifications are no longer * allowed and referring to missing columns will now cause exceptions. * * @return void */ public function testFreezer() { $toolbox = R::$toolbox; $adapter = $toolbox->getDatabaseAdapter(); $writer = $toolbox->getWriter(); $redbean = $toolbox->getRedBean(); $pdo = $adapter->getDatabase(); $a = new RedBean_AssociationManager($toolbox); $post = $redbean->dispense('post'); $post->title = 'title'; $redbean->store($post); $page = $redbean->dispense('page'); $page->name = 'title'; $redbean->store($page); $page = $redbean->dispense("page"); $page->name = "John's page"; $idpage = $redbean->store($page); $page2 = $redbean->dispense("page"); $page2->name = "John's second page"; $idpage2 = $redbean->store($page2); $a->associate($page, $page2); $redbean->freeze(TRUE); $page = $redbean->dispense("page"); $page->sections = 10; $page->name = "half a page"; try { $id = $redbean->store($page); fail(); } catch (RedBean_Exception_SQL $e) { pass(); } $post = $redbean->dispense("post"); $post->title = "existing table"; try { $id = $redbean->store($post); pass(); } catch (RedBean_Exception_SQL $e) { fail(); } asrt(in_array("name", array_keys($writer->getColumns("page"))), TRUE); asrt(in_array("sections", array_keys($writer->getColumns("page"))), FALSE); $newtype = $redbean->dispense("newtype"); $newtype->property = 1; try { $id = $redbean->store($newtype); fail(); } catch (RedBean_Exception_SQL $e) { pass(); } $logger = RedBean_Plugin_QueryLogger::getInstanceAndAttach($adapter); // Now log and make sure no 'describe SQL' happens $page = $redbean->dispense("page"); $page->name = "just another page that has been frozen..."; $id = $redbean->store($page); $page = $redbean->load("page", $id); $page->name = "just a frozen page..."; $redbean->store($page); $page2 = $redbean->dispense("page"); $page2->name = "an associated frozen page"; $a->associate($page, $page2); $a->related($page, "page"); $a->unassociate($page, $page2); $a->clearRelations($page, "page"); $items = $redbean->find("page", array(), array("1")); $redbean->trash($page); $redbean->freeze(FALSE); asrt(count($logger->grep("SELECT")) > 0, TRUE); asrt(count($logger->grep("describe")) < 1, TRUE); asrt(is_array($logger->getLogs()), TRUE); }