public static function GetRelatedBeans($bean1, $type) { //Get a new association manager $association = new \RedBean_AssociationManager(self::Toolbox()); //return the related beans of type $type return $association->related($bean, $type); }
/** * The opposite of related(). Returns all the beans that are not * associated with the bean provided. * * @param RedBean_OODBBean $bean bean provided * @param string $type type of bean you are searching for * @param string $sql SQL for extra filtering * @param array $values values to be inserted in SQL slots * * @return array $beans beans */ public static function unrelated(RedBean_OODBBean $bean, $type, $sql = null, $values = array()) { $idfield = self::$writer->getIDField($type); $keys = self::$associationManager->related($bean, $type); $rows = self::$writer->selectRecord($type, array($idfield => $keys), array($sql, $values), false, true); return self::$redbean->convertToBeans($type, $rows); }
/** * Fetches related domain objects. * @param string $className * @param mixed $constructorArg * @return mixed $models */ protected function related($className, $constructorArg = null) { $models = array(); $model = new $className(); $keys = $this->associationManager->related($this->bean, $model->getBeanType()); foreach ($keys as $key) { $modelItem = new $className($constructorArg); $modelItem->find((int) $key); $models[$key] = $modelItem; } return $models; }
/** * Returns all beans that have been tagged with one or more * of the specified tags. * * Tag list can be either an array with tag names or a comma separated list * of tag names. * * @param string $beanType type of bean you are looking for * @param array|string $tagList list of tags to match * * @return array */ public function tagged($beanType, $tagList) { $tags = $this->extractTagsIfNeeded($tagList); $collection = array(); $tags = $this->redbean->find('tag', array('title' => $tags)); if (is_array($tags) && count($tags) > 0) { $collectionKeys = $this->associationManager->related($tags, $beanType); if ($collectionKeys) { $collection = $this->redbean->batch($beanType, $collectionKeys); } } return $collection; }
/** * 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"); }
$movie2 = $redbean2->dispense("movie"); asrt(isset($movie2->movie_id), true); $movie2->name = "movie 2"; $movieid2 = $redbean2->store($movie2); $movie1 = $redbean2->load("movie", $movieid); asrt($movie->name, "movie 1"); $movie2 = $redbean2->load("movie", $movieid2); asrt($movie2->name, "movie 2"); $movies = $redbean2->batch("movie", array($movieid, $movieid2)); asrt(count($movies), 2); asrt($movies[$movieid]->name, "movie 1"); asrt($movies[$movieid2]->name, "movie 2"); $toolbox2 = new RedBean_ToolBox($redbean2, $adapter, $writer2); $a2 = new RedBean_AssociationManager($toolbox2); $a2->associate($movie1, $movie2); $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");
/** * Returns all beans that have been tagged with one of the tags given. * * @param $beanType type of bean you are looking for * @param $tagList list of tags to match * * @return array */ public function tagged($beanType, $tagList) { if ($tagList !== false && !is_array($tagList)) { $tags = explode(",", (string) $tagList); } else { $tags = $tagList; } $collection = array(); $tags = $this->redbean->find('tag', array('title' => $tags)); if (is_array($tags) && count($tags) > 0) { $collectionKeys = $this->associationManager->related($tags, $beanType); if ($collectionKeys) { $collection = $this->redbean->batch($beanType, $collectionKeys); } } return $collection; }
/** * Convenience Method * @param RedBean_OODBBean $bean * @param string $type * @param string $sql * @param array $values * @return array $beans */ public static function findRelated(RedBean_OODBBean $bean, $type, $sql, $values = array()) { $keys = self::$associationManager->related($bean, $type); $sql = str_replace(":keys", implode(",", $keys), $sql); return self::find($type, $sql, $values); }
/** * 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); }
/** * Returns all the beans associated with $bean. * @param RedBean_OODBBean $bean * @param string $type * @return array $beans */ public static function related(RedBean_OODBBean $bean, $type) { return self::$redbean->batch($type, self::$associationManager->related($bean, $type)); }