public function fetchRelationData($tableEntity, $config) { $entityCfg = $tableEntity->getConfig(); $key = $tableEntity->{$config}['key']; $config['class'] = new $config['class'](); $fileds = $config['class']->getFileds(); $relateCfg = $config['class']->getConfig(); if ($fileds[0] == '*') { $fileds = $relateCfg['columns']; } $crit = null; if (isset($config['criteria']) && is_object($config['criteria'])) { $crit = $config['criteria']; } else { $crit = new self($config['class']); $crit->setFileds($fileds); } $crit->add(Criteria::_AND, Restrictions::eq($config['column'], $key)); $cache = CacheManager::getInstance(); /* 缓存机制需要实现 by Alan 20130301 $sql = $crit->sql(); $parmas = $crit->getParameters(); $data = $cache->get(CriteriaQuery::getDumpSQL($sql, $parmas)); if($data){ return $data; }*/ $totalNum = 0; $fileds = $crit->getFileds(); $projectionEntitys = $crit->getProjectionEntitys(); $dataPager = $crit->getDataPager(); //获取分页器 if (isset($projectionEntitys) && count($projectionEntitys) > 0) { $crit->cleanFileds(); $crit->cleanLimit(); $rs1 = $crit->_array(false); $totalNum = @current(@current($rs1)); if (is_object($dataPager)) { $dataPager->setTotalNum($totalNum); } $crit->cleanProjection(); } $crit->setFileds($fileds); if (is_object($dataPager)) { $crit->setFirstResult($dataPager->getFirstResult()); $crit->setFetchSize($dataPager->getPageSize()); } $rs = $crit->_array(false); if ($rs) { $class = get_class($config['class']); if ($config['relation'] == 'one-to-one') { $rs = current($rs); $data = new $class(); $data->setFileds($fileds); foreach ($rs as $k => $v) { $data->{$k} = $v; } //检查多级关联 $cfgl = $data->getRelationPro(); if (isset($cfgl) && is_array($cfgl)) { foreach ($cfgl as $pro => $cfg) { if (!isset($cfg['lazy']) || !$cfg['lazy'] == true) { $data->{$cfg}['name'] = $this->fetchRelationData($data, $cfg); } } } $data->setCriteria($this); //$cache->set(CriteriaQuery::getDumpSQL($sql, $parmas),$data); return $data; } else { $dataList = array(); foreach ($rs as $i => $item) { $data = new $class(); $data->setFileds($fileds); foreach ($item as $k => $v) { $data->{$k} = $v; } $data->setCriteria($this); //检查多级关联 $cfgl = $data->getRelationPro(); if (isset($cfgl) && is_array($cfgl)) { foreach ($cfgl as $pro => $cfg) { if (!isset($cfg['lazy']) || !$cfg['lazy'] == true) { $data->{$cfg}['name'] = $this->fetchRelationData($data, $cfg); } } } array_push($dataList, $data); } return $dataList; } } //} return null; }
/** * 按实体查询数据库 * @param object $entity * @param Order $order 指定排序规则, 可以为 Order对像的数组; * @reutrn 返回绑定实体后的数组对象; */ public function findByEntity($entity, $order = null) { if (is_object($entity)) { $config = $entity->getConfig(); $columns = $config['columns']; $criteria = new MongoCriteriaImpl($entity); $criteria->setFileds($entity->getFileds()); //要查询的字段 //set order if (is_object($order)) { $criteria->addOrder($order); } else { if (is_array($order)) { foreach ($order as $orderItem) { $criteria->addOrder($orderItem); } } } //add Restrictions; foreach ($columns as $column) { if ($entity->{$column} != null) { $criteria->add(Criteria::_AND, Restrictions::eq($column, $entity->{$column})); } } return $this->findAll($criteria); } }