Example #1
0
 /**
  * 列出所有模型
  */
 function actionModels()
 {
     $models = new QColl('QReflection_Model');
     foreach ($this->_managed_app->reflectionModules() as $module) {
         $models->append($module->reflectionModels());
     }
     $this->view['models'] = $models;
     try {
         $tables = $this->_getDBO()->metaTables();
         if (!empty($tables)) {
             $tables = array_combine($tables, $tables);
         }
         array_unshift($tables, 0);
         $tables[0] = '- 选择要使用的数据表 -';
     } catch (QException $ex) {
         $error = $this->_getLastError();
         if ($error) {
             $error = "\n\n{$error}";
         }
         $this->app()->setFlashMessage($ex->getMessage() . $error, self::FLASH_MSG_ERROR);
         $tables = array('- 无法读取数据库或没有数据表 -');
     }
     $this->view['tables'] = $tables;
     $this->_help_text = '查看已有的模型,并能够创建新模型。';
 }
 /**
  * 列出所有模型
  */
 function actionModels()
 {
     $models = new QColl('QReflection_Model');
     foreach ($this->_managed_app->modules() as $module) {
         $models->append($module->models());
     }
     $this->_view['models'] = $models;
     try {
         $tables = @$this->_getDBO()->metaTables();
         if (!empty($tables)) {
             $tables = array_combine($tables, $tables);
         }
         array_unshift($tables, 0);
         $tables[0] = '- 选择要使用的数据表 -';
     } catch (QException $ex) {
         $error = $this->_getLastError();
         if ($error) {
             $error = "\n\n{$error}";
         }
         return $this->_redirectMessage('失败 - 无法读取数据库或没有数据表', $ex->getMessage(), url('default/index'));
     }
     $this->_view['tables'] = $tables;
 }
Example #3
0
 /**
  * 魔法方法,实现对象属性的设置
  *
  * @param string $prop_name
  * @param mixed $value
  */
 function __set($prop_name, $value)
 {
     $meta = self::$_meta[$this->_class_name];
     /* @var $meta QDB_ActiveRecord_Meta */
     if (!isset($meta->props[$prop_name])) {
         throw new QDB_ActiveRecord_UndefinedPropException($this->_class_name, $prop_name);
     }
     $config = $meta->props[$prop_name];
     if ($config['readonly']) {
         throw new QDB_ActiveRecord_SettingReadonlyPropException($this->_class_name, $prop_name);
     }
     if (!empty($config['setter'])) {
         // 如果指定了属性的 setter,则通过 setter 方法来修改属性值
         $callback = $config['setter'];
         if (!is_array($callback[0])) {
             $this->{$callback[0]}($value);
             return;
         } else {
             call_user_func($callback[0], $this, $value);
         }
         // 修改属性的脏状态
         $this->_changed_props[$prop_name] = $prop_name;
         return;
     }
     if ($config['assoc']) {
         // 在指定关联对象时,要进行类型检查
         if ($config['assoc'] == QDB::HAS_ONE || $config['assoc'] == QDB::BELONGS_TO) {
             if ($value instanceof $config['assoc_class']) {
                 $this->_props[$prop_name] = $value;
             } else {
                 throw new QDB_ActiveRecord_SettingPropTypeMismatch($this->_class_name, $prop_name, $config['assoc_class'], gettype($value));
             }
         } else {
             if (is_array($value)) {
                 $this->_props[$prop_name] = QColl::createFromArray($value, $config['assoc_class']);
             } elseif ($value instanceof Iterator) {
                 $this->_props[$prop_name] = $value;
             } else {
                 throw new QDB_ActiveRecord_SettingPropTypeMismatch($this->_class_name, $prop_name, 'Iterator', gettype($value));
             }
         }
         $this->_changed_props[$prop_name] = $prop_name;
     } elseif ($this->_props[$prop_name] !== $value) {
         $this->_props[$prop_name] = self::_typed($value, $config['ptype']);
         $this->_changed_props[$prop_name] = $prop_name;
     }
 }
Example #4
0
 /**
  * @dataProvider arrProvider
  */
 function testCreateFromArray($data)
 {
     $arr = array();
     foreach ($data as $item) {
         $arr[] = new MyItem($item['index']);
     }
     $coll = QColl::createFromArray($arr, 'MyItem');
     $this->assertEquals(count($data), count($coll));
     $this->assertEquals($data, $coll->toArray());
 }
Example #5
0
 /**
  * 魔法方法,实现对象属性的设置
  *
  * @param string $prop_name
  * @param mixed $value
  */
 function __set($prop_name, $value)
 {
     $meta = self::$_meta[$this->_class_name];
     /* @var $meta QDB_ActiveRecord_Meta */
     if (!isset($meta->props[$prop_name])) {
         throw new QDB_ActiveRecord_UndefinedPropException($this->_class_name, $prop_name);
     }
     $config = $meta->props[$prop_name];
     if ($config['readonly']) {
         throw new QDB_ActiveRecord_ChangingReadonlyPropException($this->_class_name, $prop_name);
     }
     if (!empty($config['setter'])) {
         // 如果指定了属性的 setter,则通过 setter 方法来修改属性值
         list($callback, $custom_parameters) = $config['setter'];
         if (!is_array($callback)) {
             $callback = array($this, $callback);
             $args = array($value, $prop_name, $custom_parameters, &$this->_props);
         } else {
             $args = array($this, $value, $prop_name, $custom_parameters, &$this->_props);
         }
         return call_user_func_array($callback, $args);
     }
     if ($config['assoc']) {
         // 在指定关联对象时,要进行类型检查
         if ($config['assoc'] == QDB::HAS_ONE || $config['assoc'] == QDB::BELONGS_TO) {
             if ($value instanceof $config['assoc_class']) {
                 $this->_props[$prop_name] = $value;
                 if ($config['assoc'] == QDB::BELONGS_TO) {
                     $assoc = $meta->assoc($prop_name);
                     $this->_props[$assoc->source_key] = $value[$assoc->target_key];
                     $this->_changed_props[$assoc->source_key] = $assoc->source_key;
                 }
             } else {
                 throw new QDB_ActiveRecord_SettingPropTypeMismatchException($this->_class_name, $prop_name, $config['assoc_class'], gettype($value));
             }
         } else {
             if (is_array($value)) {
                 $this->_props[$prop_name] = QColl::createFromArray($value, $config['assoc_class']);
             } elseif ($value instanceof Iterator) {
                 $this->_props[$prop_name] = $value;
             } else {
                 throw new QDB_ActiveRecord_SettingPropTypeMismatchException($this->_class_name, $prop_name, 'Iterator', gettype($value));
             }
         }
         $this->_changed_props[$prop_name] = $prop_name;
     } elseif ($this->_props[$prop_name] !== $value) {
         $this->_props[$prop_name] = self::_typed($value, $config['ptype']);
         $this->_changed_props[$prop_name] = $prop_name;
     }
 }
Example #6
0
 /**
  * 以对象方式返回数据
  * 如果设置了return_first为true,直接返回单个对象,否则返回对象集合
  * 更多讨论,参看:http://qeephp.com/bbs/thread-7551-1-1.html
  * 
  * @param string $class_name 
  * @param boolean $return_first 
  * @access public
  * @return mixed
  */
 function fetchObject($class_name, $return_first = false)
 {
     $objs = array();
     $is_ar = is_subclass_of($class_name, 'QDB_ActiveRecord_Abstract');
     while ($row = $this->fetchRow()) {
         $obj = $is_ar ? new $class_name($row, QDB::FIELD, true) : new $class_name($row);
         if ($return_first) {
             return $obj;
         }
         $objs[] = $obj;
     }
     return QColl::createFromArray($objs, $class_name);
 }
Example #7
0
 /**
  * 迭代方法:迭代状态是否有效
  *
  * @return boolean
  */
 function valid()
 {
     return $this->_elements->valid();
 }