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; }
/** * * @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; }