public function eagerFetching(DbFetcher $oQuery, ObjectMapper $oParentMapper, $sPrefix, $aParams = array(), $aLocalParams = array())
 {
     if (isset($this->aParams['ToModuleAlias'])) {
         Core::import('Modules.' . $this->aParams['ToModuleAlias']);
     }
     $oMapper = Manager::getInstance()->getMapper($this->aParams['ToMapperAlias']);
     //echo '<pre>', print_r($oMapper, true), '</pre>'; die();
     $aContainer = $oMapper->getContainer();
     if ($oMapper) {
         $oParentFields = $oParentMapper->getFields();
         $oQuery->addJoinTable($aContainer['TableName'], $sPrefix . '_' . $this->getAlias(), DbFetcher::JOIN_LEFT, $sPrefix . '.' . $oParentFields->get($this->getField())->getField() . ' = ' . $sPrefix . '_' . $this->getAlias() . '.id');
         $oFields = $oMapper->getFields();
         foreach ($oFields as $alias => $field) {
             if ($field->getType() != 'Object' && $field->getField()) {
                 $oQuery->addSelectField($sPrefix . '_' . $this->getAlias() . '.' . $field->getField(), $sPrefix . '_' . $this->getAlias() . '_' . $field->getField());
             }
         }
         // Условия выборки
         if (isset($aLocalParams['Criteria']) && is_object($aLocalParams['Criteria'])) {
             $oQuery->addCriteria(call_user_func(array($aLocalParams['Criteria'], 'renderWhere')));
         }
         if (isset($aLocalParams['Criteria']) && is_array($aLocalParams['Criteria']) && count($aLocalParams['Criteria']) > 0) {
             $oCriteria = new CriteriaGroup(Criteria::TYPE_AND);
             foreach ($aLocalParams['Criteria'] as $k => $itm) {
                 if (is_object($itm)) {
                     $oCriteria->addElement($itm);
                 } else {
                     if (is_array($itm)) {
                         $oCriteria->addElement(new CriteriaElement($k, $itm['Type'], $itm['Value']));
                     } else {
                         $oCriteria->addElement(new CriteriaElement($k, '=', $itm));
                     }
                 }
             }
             $oQuery->addCriteria($oMapper->parseFindCriteria($oCriteria->renderWhere(), $sPrefix . '_' . $this->getAlias()));
         }
         if (isset($aLocalParams['Criteria']) && is_string($aLocalParams['Criteria'])) {
             $oQuery->addCriteria($oMapper->parseFindCriteria($aLocalParams['Criteria'], $sPrefix . '_' . $this->getAlias()));
         }
         // Сортировка
         if (isset($aLocalParams['Order']) && is_array($aLocalParams['Order']) && count($aLocalParams['Order']) > 0) {
             foreach ($aLocalParams['Order'] as $k => $itm) {
                 $oQuery->addOrder($oMapper->parseFindField($k, $sPrefix . '_' . $this->getAlias()), $itm);
             }
         }
         if (isset($aLocalParams['With']) && is_array($aLocalParams['With']) && count($aLocalParams['With'])) {
             // TODO: Вложенные JOINы
         }
     }
     return $oQuery;
 }
 public function eagerFetching(DbFetcher $oQuery, ObjectMapper $oParentMapper, $sPrefix, $aParams = array(), $aLocalParams = array())
 {
     $oMapper = Manager::getInstance()->getMapper($this->aParams['ToMapperAlias']);
     if ($oMapper) {
         $oQuery->addJoinTable($this->aParams['TableName'], $this->getAlias(), DbFetcher::JOIN_LEFT, $sPrefix . '.id' . ' = ' . $this->getAlias() . '.' . $this->aParams['Field2']);
         // Условия выборки
         if (isset($aLocalParams['Criteria']) && is_object($aLocalParams['Criteria'])) {
             $oQuery->addCriteria(call_user_func(array($aLocalParams['Criteria'], 'renderWhere')));
         }
         if (isset($aLocalParams['Criteria']) && is_array($aLocalParams['Criteria']) && count($aLocalParams['Criteria']) > 0) {
             $oCriteria = new CriteriaGroup(Criteria::TYPE_AND);
             foreach ($aLocalParams['Criteria'] as $k => $itm) {
                 if (is_object($itm)) {
                     $oCriteria->addElement($itm);
                 } else {
                     if (is_array($itm)) {
                         $oCriteria->addElement(new CriteriaElement($k, $itm['Type'], $itm['Value']));
                     } else {
                         $oCriteria->addElement(new CriteriaElement($k, '=', $itm));
                     }
                 }
             }
             $oQuery->addCriteria($oMapper->parseFindCriteria($oCriteria->renderWhere(), $sPrefix . '_' . $this->getAlias()));
         }
         if (isset($aLocalParams['Criteria']) && is_string($aLocalParams['Criteria'])) {
             $oQuery->addCriteria($oMapper->parseFindCriteria($aLocalParams['Criteria'], $sPrefix . '_' . $this->getAlias()));
         }
         // Сортировка
         if (isset($aLocalParams['Order']) && is_array($aLocalParams['Order']) && count($aLocalParams['Order']) > 0) {
             foreach ($aLocalParams['Order'] as $k => $itm) {
                 $oQuery->addOrder($oMapper->parseFindField($k, $sPrefix . '_' . $this->getAlias()), $itm);
             }
         }
         if (isset($aLocalParams['With']) && is_array($aLocalParams['With']) && count($aLocalParams['With'])) {
             // TODO: Вложенные JOINы
         }
     }
     return $oQuery;
 }
Beispiel #3
0
 /**
  *
  * @param <type> $sFunction
  * @param <type> $sAlias
  * @param <type> $mFunctionParams
  * @param <type> $aParams
  * @return <type>
  */
 public function findStat($sFunction, $sAlias, $mFunctionParams = false, $aParams = array())
 {
     $paramsDefault = $this->scopeActive ? $this->scopeActive : $this->defaultScope();
     $aParams = ArrayHelper::merge($paramsDefault, $aParams);
     $this->scopeActive = false;
     $sClassName = $this->sModelAlias;
     $oQuery = new DbFetcher($this->tableName(), $sClassName, $this->getDbConnectionAlias());
     // Eager fetching
     if (isset($aParams['With'])) {
     }
     $oQuery->addSelectField($mFunctionParams, $sAlias, $sFunction, $mFunctionParams);
     // Условия выборки
     if (isset($aParams['Criteria']) && is_object($aParams['Criteria'])) {
         $oQuery->addCriteria($aParams['Criteria']->renderWhere());
     }
     if (isset($aParams['Criteria']) && is_array($aParams['Criteria']) && count($aParams['Criteria']) > 0) {
         $oCriteria = new CriteriaGroup('AND');
         foreach ($aParams['Criteria'] as $k => $itm) {
             if (is_object($itm)) {
                 $oCriteria->addElement($itm);
             } else {
                 if (is_array($itm)) {
                     $oCriteria->addElement(new CriteriaElement($k, $itm['Type'], $itm['Value']));
                 } else {
                     $oCriteria->addElement(new CriteriaElement($k, '=', $itm));
                 }
             }
         }
         $oQuery->addCriteria($this->parseFindCriteria($oCriteria->renderWhere()));
     }
     // Лимит выборки
     $oQuery->setLimit(1);
     // Смещение выборки
     $oQuery->setOffset(0);
     // Сортировка
     if (isset($aParams['Order']) && is_array($aParams['Order']) && count($aParams['Order']) > 0) {
         foreach ($aParams['Order'] as $k => $itm) {
             $oQuery->addOrder($this->parseFindField($k), $itm);
         }
     }
     if (isset($aParams['Group']) && is_array($aParams['Group']) && count($aParams['Group']) > 0) {
         foreach ($aParams['Group'] as $k => $itm) {
             $oQuery->addGroup($itm);
         }
     }
     if (isset($aParams['With']) && is_array($aParams['With']) && count($aParams['With'])) {
         foreach ($aParams['With'] as $k => $rel) {
             $oRelation = false;
             $aLocalParams = array();
             if (is_array($rel)) {
                 $oRelation = $this->oRelations->get($k);
                 $aLocalParams = $rel;
             } else {
                 if (is_string($rel)) {
                     $oRelation = $this->oRelations->get($rel);
                 }
             }
             if ($oRelation) {
                 $oQuery = $oRelation->eagerFetching($oQuery, $this, $sClassName, $aParams, $aLocalParams);
             }
         }
     }
     $mResult = $oQuery->fetchCell();
     return $mResult;
 }