/** * Constructs a new RedBeanModels which is a collection of classes extending model. * The models are created lazily. * Models are only constructed with beans by the model. Beans are * never used by the application directly. * The application can construct a new models object by constructing * them without specifying a bean. In other words, if Php had overloading * and friends the constructor without the $bean would be public, and the * constructor taking a bean would private and available only to RedBeanModel. */ public function __construct($modelClassName, $sqlOrBean = '') { assert('is_string($sqlOrBean) || $sqlOrBean instanceof RedBean_OODBBean'); $this->modelClassName = $modelClassName; $this->position = 0; $tableName = RedBeanModel::getTableName($modelClassName); if (is_string($sqlOrBean)) { $this->relatedBeansAndModels = array_values(R::find($tableName, $sqlOrBean)); } else { assert('$sqlOrBean instanceof RedBean_OODBBean'); $this->bean = $sqlOrBean; // I had this... // $this->relatedBeansAndModels = array_values(R::related($this->bean, $tableName)); // and the doco says to use related in place of findLinks which is deprecated, // but that is returning zero when I know there are linked beans. try { // So I'm getting them with the link manager, but that can // throw if the table or column doesn't exist yet because there // are no linked beans. if ($this->bean->id > 0) { $relatedIds = ZurmoRedBeanLinkManager::getKeys($this->bean, $tableName); $this->relatedBeansAndModels = array_values(R::batch($tableName, $relatedIds)); } else { $this->relatedBeansAndModels = array(); } } catch (RedBean_Exception_SQL $e) { // SQLSTATE[42S02]: Base table or view not found... // SQLSTATE[42S22]: Column not found... if (!in_array($e->getSQLState(), array('42S02', '42S22'))) { throw $e; } // If there is nothing yet linked // just have no related models yet. $this->relatedBeansAndModels = array(); } } }
public function save($runValidation = true) { if (!parent::save($runValidation)) { return false; } foreach ($this->deferredRelateBeans as $bean) { if ($this->linkType == RedBeanModel::LINK_TYPE_POLYMORPHIC) { if ($this->bean->id == null) { ZurmoRedBean::store($this->bean); } $polyIdFieldName = strtolower($this->linkName) . '_id'; $polyTypeFieldName = strtolower($this->linkName) . '_type'; $bean->{$polyTypeFieldName} = $this->bean->getMeta('type'); $bean->{$polyIdFieldName} = $this->bean->id; } else { ZurmoRedBeanLinkManager::link($bean, $this->bean, $this->resolveLinkNameForCasing()); } ZurmoRedBean::store($bean); } $this->deferredRelateBeans = array(); $relatedModelClassName = $this->relatedModelClassName; $tableName = $relatedModelClassName::getTableName(); foreach ($this->deferredUnrelateBeans as $bean) { if (!$this->owns) { if ($this->linkType == RedBeanModel::LINK_TYPE_POLYMORPHIC) { throw new NotSupportedException("Polymorphic relations can not be NOT_OWNED"); } ZurmoRedBeanLinkManager::breakLink($bean, $tableName, $this->resolveLinkNameForCasing()); ZurmoRedBean::store($bean); } else { ZurmoRedBean::trash($bean); } } $this->deferredUnrelatedBeans = array(); foreach ($this->deferredUnrelatedModels as $model) { $event = new CModelEvent($model); $model->onRedBeanOneToManyRelatedModelsChange($event); } $this->deferredUnrelatedModels = array(); return true; }
protected function linkBeans() { $baseModelClassName = null; $baseBean = null; foreach ($this->modelClassNameToBean as $modelClassName => $bean) { if ($baseBean !== null) { ZurmoRedBeanLinkManager::link($bean, $baseBean); if (!RedBeanDatabase::isFrozen()) { $tableName = self::getTableName($modelClassName); $columnName = self::getTableName($baseModelClassName) . '_id'; RedBeanColumnTypeOptimizer::optimize($tableName, $columnName, 'id'); } } $baseModelClassName = $modelClassName; $baseBean = $bean; } }
public function save($runValidation = true) { if (!parent::save($runValidation)) { return false; } foreach ($this->deferredRelateBeans as $bean) { if ($this->linkType == RedBeanModel::LINK_TYPE_POLYMORPHIC) { if ($this->bean->id == null) { R::store($this->bean); } $polyIdFieldName = strtolower($this->linkName) . '_id'; $polyTypeFieldName = strtolower($this->linkName) . '_type'; $bean->{$polyTypeFieldName} = $this->bean->getMeta('type'); $bean->{$polyIdFieldName} = $this->bean->id; if (!RedBeanDatabase::isFrozen()) { $tableName = RedBeanModel::getTableName($this->modelClassName); RedBeanColumnTypeOptimizer::optimize($tableName, $polyIdFieldName, 'id'); } } else { ZurmoRedBeanLinkManager::link($bean, $this->bean, $this->resolveLinkNameForCasing()); if (!RedBeanDatabase::isFrozen()) { $tableName = RedBeanModel::getTableName($this->modelClassName); $columnName = RedBeanModel::getTableName($this->relatedModelClassName) . '_id'; $columnName = ZurmoRedBeanLinkManager::resolveColumnPrefix($this->resolveLinkNameForCasing()) . $columnName; RedBeanColumnTypeOptimizer::optimize($tableName, $columnName, 'id'); } } R::store($bean); } $this->deferredRelateBeans = array(); $tableName = RedBeanModel::getTableName($this->relatedModelClassName); foreach ($this->deferredUnrelateBeans as $bean) { if (!$this->owns) { ZurmoRedBeanLinkManager::breakLink($bean, $tableName, $this->resolveLinkNameForCasing()); R::store($bean); } else { R::trash($bean); } } $this->deferredUnrelateBeans = array(); return true; }
protected function linkBeans() { // Link the beans up the inheritance hierarchy, skipping // the person bean, then link that to the user. So the // user is linked to both the person and the permitable, // to complete the mixing in of the Person's data. $baseBean = null; foreach ($this->modelClassNameToBean as $modelClassName => $bean) { if ($modelClassName == 'Person') { continue; } if ($baseBean !== null) { ZurmoRedBeanLinkManager::link($bean, $baseBean); } $baseBean = $bean; } $userBean = $this->modelClassNameToBean['User']; $personBean = $this->modelClassNameToBean['Person']; ZurmoRedBeanLinkManager::link($userBean, $personBean); }
protected function linkBeans() { // Link the beans up the inheritance hierarchy, skipping // the person bean, then link that to the user. So the // user is linked to both the person and the permitable, // to complete the mixing in of the Person's data. $baseBean = null; foreach ($this->modelClassNameToBean as $modelClassName => $bean) { if ($modelClassName == 'Person') { continue; } if ($baseBean !== null) { ZurmoRedBeanLinkManager::link($bean, $baseBean); if (!RedBeanDatabase::isFrozen()) { $tableName = self::getTableName(get_class($this)); $columnName = 'person_id'; RedBeanColumnTypeOptimizer::optimize($tableName, $columnName, 'id'); } } $baseBean = $bean; } $userBean = $this->modelClassNameToBean['User']; $personBean = $this->modelClassNameToBean['Person']; ZurmoRedBeanLinkManager::link($userBean, $personBean); if (!RedBeanDatabase::isFrozen()) { $tableName = self::getTableName(get_class($this)); RedBeanColumnTypeOptimizer::optimize($tableName, 'person_id', 'id'); } }
protected function linkBeans() { $baseBean = null; foreach ($this->modelClassNameToBean as $modelClassName => $bean) { if ($baseBean !== null) { ZurmoRedBeanLinkManager::link($bean, $baseBean); } $baseBean = $bean; } }
public function testCascadedDeleteDoesNotWorkForLinkedBeans() { $member = ZurmoRedBean::dispense('marketinglistmember'); $member->unsubscribed = true; ZurmoRedBean::store($member); $list = ZurmoRedBean::dispense('marketinglist'); $list->name = 'dummy'; ZurmoRedBean::store($list); ZurmoRedBeanLinkManager::link($member, $list); ZurmoRedBean::store($member); $id = $list->id; unset($list); ZurmoRedBean::trash($member); unset($member); $list = ZurmoRedBean::load('marketinglist', $id); $this->assertNotNull($list); // The list is not deleted. }
public function testCascadedDeleteDoesNotWorkForLinkedBeans() { $person = R::dispense('person'); $person->name = 'bill'; R::store($person); $phone = R::dispense('phone'); $phone->number = '555-1234'; R::store($phone); ZurmoRedBeanLinkManager::link($phone, $person); R::store($phone); $id = $phone->id; unset($phone); R::trash($person); unset($person); $phone = R::load('phone', $id); $this->assertNotNull($phone); // The phone is not deleted. }