/** * Register attributes for a class. * This must be done before creating an instance of Attributes * for that class. Registration can be done only once. * * @throws Exception\RuntimeException if the class is already registered. */ public static function setClassAttributes($className, AttributeSet $attributes) { if (self::attributesSetFor($className)) { throw new Exception\RuntimeException(srptinf("Attributes already set for class %s", $className)); } self::$classAttributes[$className] = $attributes; }
public function getConstraint($constraintName, $table, $schema = null) { $this->properSchema($schema); $constraints = $this->getConstraints($table, $schema); if (!isset($constraints[$constraintName])) { throw new \Exception(srptinf("Constraint '%s' was not found in table '%s' in schema '%s'", $constraintName, $table, $schema)); } return $constraints[$constraintName]; }
/** * @throw Exception\RuntimeException */ protected function createRecord() { return $this->runCallbacks('create', function () { $infl = self::services()->get('inflector'); $associations = $this->normalizeAssociations(); if (isset($associations['belongsTo'])) { /** * Example: * A reference for model "User" will be saved in the "user" attribute. * It is check if the "user_id" attribute exists. If it does, the reference * is created out of that id and stored in the "user" attribute. * If "user_id" doesn't exist, it is check if the "user" attribute exists and * is an array. If so, it's assumed the reference was already created. * If all this fails, an exception is thrown. */ foreach ($associations['belongsTo'] as $attrName => $options) { $refAttr = $infl->underscore($attrName); $refAttrId = $refAttr . '_id'; if (isset($this->attributes[$refAttrId])) { switch (true) { case is_int($this->attributes[$refAttrId]) || is_string($this->attributes[$refAttrId]): # String or int; referencing id. if (!isset($options['className'])) { $options['className'] = $this->resolveAssociationClass($attrName); } $remoteClass = $options['className']; $remoteColl = $remoteClass::tableName(); $ref = \MongoDBRef::create($remoteColl, (int) $this->attributes[$refAttrId], static::connection()->dbName()); $this->attributes[$refAttr] = $ref; break; case isset($this->attributes[$refAttr]) && is_array($this->attributes[$refAttr]): # It's assumed the reference was already created. break; default: throw new Exception\RuntimeException(srptinf("Failed to create association: neither attribute '%s' and '%s' exist or didn't match conditions", $refAttrId, $refAttr)); break; } } else { $this->attributes[$attrName] = null; } } } self::castToDate($this->attributes, true); $resp = static::connection()->insert(static::tableName(), $this->attributes); self::castFromDate($this->attributes); return $resp; }); }