/** * 获取所有元数据 * * 若没有主键则返回false * * @param bool $reload_from_db 如果数据没则自动从数据库加载 * @return array|false */ public function get_all_metadata($reload_from_db = true) { if (!$this->pk()) { return false; } $meta_group_of_key = OOP_ORM_DI::get_meta_group_of_key($this->_class_name); $meta_table_of_key = OOP_ORM_DI::get_meta_table_of_key($this->_class_name); $data = array(); if ($meta_group_of_key) { if ($this->_metadata) { # 检查下是否全部加载完毕 $table_loaded = array(); foreach ($meta_table_of_key as $key => $table) { if (isset($table_loaded[$table])) { # 已经加载过的表 continue; } $group = $meta_group_of_key[$key]; if (is_array($this->_metadata[$table]) && array_key_exists($group, $this->_metadata[$table])) { continue; } # 重新加载全部数据 $this->finder()->load_metadata($this, $table); # 标记为已经加载过 $table_loaded[$table] = 1; } } else { if ($reload_from_db) { $this->finder()->load_all_metadata($this); } } foreach ($meta_table_of_key as $key => $table) { $this->_get_di_by_key($key)->get_field_data($this, $data, $this->_compiled_data[$key], $this->_is_temp_instance && !$this->_is_support_object_value); } } return $data; }
/** * 加载对应数据库所有元数据 * * @param OOP_ORM_Data $obj * @return $this * @throws Exception */ public function load_all_metadata(OOP_ORM_Data $obj) { $class_name = $obj->class_name(); $meta_table_of_key = OOP_ORM_DI::get_meta_table_of_key($class_name); $meta_group_of_key = OOP_ORM_DI::get_meta_group_of_key($class_name); if (!$meta_table_of_key) { # 没有元数据 return $this; } # 没有主键 if (!$obj->pk()) { return $this; } $keys_of_table = array(); foreach ($meta_table_of_key as $key => $table) { $keys_of_table[$table][] = $key; } $data = array(); $groups_of_table = array(); # 读数据 foreach ($keys_of_table as $table => $keys) { foreach ($this->load_metadata($obj, $table) as $hash => $item) { $data[$table][$item['meta_group']][$hash] = $item; } foreach ($keys as $key) { $group = $meta_group_of_key[$key]; $groups_of_table[$table][$group] = $group; } } foreach ($groups_of_table as $table => $groups) { foreach ($groups as $group) { # 预置空数据 $obj->__orm_callback('set_metadata', $table, $group, array()); } } foreach ($data as $table => $group_data) { foreach ($group_data as $group => $item) { $obj->__orm_callback('set_metadata', $table, $group, $item); } } return $this; }