/** * 根据字段ORM配置获取ORM数据 * * @param OOP_ORM_Data $data_obj * @param array $orm_config * @throws Exception * @return mixed */ public static function get_orm_data_by_config(OOP_ORM_Data $data_obj, $orm_config, $index) { if (isset($orm_config['cache'])) { # 设置了缓存 $c_config = $orm_config; foreach ($c_config['mapping'] as &$item) { $item = $data_obj->{$item}; } $data = OOP_ORM_Parse::get_orm_cache_data($data_obj, $index, $c_config); $orm_name = 'ORM_' . $orm_config['name'] . '_Data'; if ($data && is_object($data) && $data instanceof $orm_name) { return $data; } $can_try_get_gourps_data = false; } else { # 是否可以批量取对象集里的数据 $can_try_get_gourps_data = true; } # 映射ORM对象 $obj_name = 'ORM_' . $orm_config['name'] . '_Finder'; if (!class_exists($obj_name, true)) { throw new Exception('指定的ORM:' . $orm_config['name'] . '不存在!'); } $obj = new $obj_name(); # 支持OFFSET if (isset($orm_config['offset'])) { $obj->offset($orm_config['offset']); if ($orm_config['offset'] > 0) { $can_try_get_gourps_data = false; //有OFFSET的话,不能同时取多条数据 } } # 支持GROUP BY if (isset($orm_config['group_by'])) { foreach ($orm_config['group_by'] as $item) { $obj->group_by($item); } $can_try_get_gourps_data = false; } # 支持ORDER BY if (isset($orm_config['order_by'])) { foreach ($orm_config['order_by'] as $key => $item) { $obj->order_by($key, $item); } $can_try_get_gourps_data = false; } # 支持IN if (isset($orm_config['in'])) { foreach ($orm_config['in'] as $key => $item) { $obj->in($key, $item); } $can_try_get_gourps_data = false; } # 获取ORM单条数据 if ($can_try_get_gourps_data && $orm_config['return'] == OOP_ORM::PARAM_RETURN_SINGLE) { # 对于单条数据,可以尝试批量获取,以优化SQL性能 $data = OOP_ORM_Parse::_get_orm_group_data($obj, $data_obj, $orm_config, $index); if (true !== $data) { # 如果!==true,则直接返回 return $data; } } $orm_where = array(); # 处理mapping if ($orm_config['mapping']) { foreach ($orm_config['mapping'] as $k => $v) { $orm_where[$k] = $data_obj->{$v}; } } if (isset($orm_config['where'])) { $orm_where = $orm_config['where'] + $orm_where; } if ($orm_where) { # 设置autowhere $obj->set_auto_where($orm_where); } if ($orm_config['limit']) { $obj->limit($orm_config['limit']); } if ($orm_config['return'] == OOP_ORM::PARAM_RETURN_SINGLE) { # 获取单条数据 $data = $obj->find()->current(); } elseif ($orm_config['return'] == OOP_ORM::PARAM_RETURN_GROUP) { # 获取一组数据 $data = $data = $obj->find(); } else { # 当前ORM对象 $data = $obj; } if (isset($orm_config['cache'])) { # 设置缓存 OOP_ORM_Parse::set_orm_cache_data($data_obj, $index, $c_config, $data); } return $data; }