📄 dbo_source.php.svn-base
字号:
if (!empty($queryData['fields'])) { $this->__bypass = true; } foreach($model->__associations as $type) { foreach($model->{$type} as $assoc => $assocData) { if ($model->recursive > -1) { $linkModel =& $model->{$assoc}; $external = isset($assocData['external']); if ($model->name == $linkModel->name && $type != 'hasAndBelongsToMany' && $type != 'hasMany') { if (true === $this->generateSelfAssociationQuery($model, $linkModel, $type, $assoc, $assocData, $queryData, $external, $null)) { $linkedModels[] = $type . '/' . $assoc; } } else { if ($model->useDbConfig == $linkModel->useDbConfig) { if (true === $this->generateAssociationQuery($model, $linkModel, $type, $assoc, $assocData, $queryData, $external, $null)) { $linkedModels[] = $type . '/' . $assoc; } } } } } } // Build final query SQL $query = $this->generateAssociationQuery($model, $null, null, null, null, $queryData, false, $null); $resultSet = $this->fetchAll($query, $model->cacheQueries, $model->name); $filtered = $this->__filterResults($resultSet, $model); if ($model->recursive > 0) { foreach($model->__associations as $type) { foreach($model->{$type} as $assoc => $assocData) { $db = null; $linkModel =& $model->{$assoc}; if (!in_array($type . '/' . $assoc, $linkedModels)) { if ($model->useDbConfig == $linkModel->useDbConfig) { $db =& $this; } else { $db =& ConnectionManager::getDataSource($linkModel->useDbConfig); } } elseif($model->recursive > 1 && ($type == 'belongsTo' || $type == 'hasOne')) { // Do recursive joins on belongsTo and hasOne relationships $db =& $this; } else { unset ($db); } if (isset($db) && $db != null) { $stack = array($assoc); $db->queryAssociation($model, $linkModel, $type, $assoc, $assocData, $array, true, $resultSet, $model->recursive - 1, $stack); unset($db); } } } $this->__filterResults($resultSet, $model, $filtered); } if (!is_null($recursive)) { $model->recursive = $_recursive; } return $resultSet; }/** * Private method. Passes association results thru afterFind filter of corresponding model * * @param unknown_type $results * @param unknown_type $model * @param unknown_type $filtered * @return unknown */ function __filterResults(&$results, &$model, $filtered = array()) { $filtering = array(); $associations = am($model->belongsTo, $model->hasOne, $model->hasMany, $model->hasAndBelongsToMany); $count = count($results); for($i = 0; $i < $count; $i++) { if (is_array($results[$i])) { $keys = array_keys($results[$i]); $count2 = count($keys); for($j = 0; $j < $count2; $j++) { $key = $keys[$j]; if (isset($associations[$key])) { $className = $associations[$key]['className']; } else { $className = $key; } if ($model->name != $className && !in_array($key, $filtered)) { if (!in_array($key, $filtering)) { $filtering[] = $key; } if (isset($model->{$className}) && is_object($model->{$className})) { $data = $model->{$className}->afterFind(array(array($key => $results[$i][$key]))); } $results[$i][$key] = $data[0][$key]; } } } } return $filtering; }/** * Enter description here... * * @param Model $model * @param unknown_type $linkModel * @param string $type Association type * @param unknown_type $association * @param unknown_type $assocData * @param unknown_type $queryData * @param unknown_type $external * @param unknown_type $resultSet * @param integer $recursive Number of levels of association * @param array $stack */ function queryAssociation(&$model, &$linkModel, $type, $association, $assocData, &$queryData, $external = false, &$resultSet, $recursive, $stack) { $query = $this->generateAssociationQuery($model, $linkModel, $type, $association, $assocData, $queryData, $external, $resultSet); if ($query) { if (!isset($resultSet) || !is_array($resultSet)) { if (Configure::read() > 0) { e('<div style = "font: Verdana bold 12px; color: #FF0000">SQL Error in model ' . $model->name . ': '); if (isset($this->error) && $this->error != null) { e($this->error); } e('</div>'); } return null; } $count = count($resultSet); for($i = 0; $i < $count; $i++) { $row =& $resultSet[$i]; $q = $this->insertQueryData($query, $resultSet[$i], $association, $assocData, $model, $linkModel, $stack); if($q != false){ $fetch = $this->fetchAll($q, $model->cacheQueries, $model->name); } else { $fetch = null; } if (!empty($fetch) && is_array($fetch)) { if ($recursive > 0) { foreach($linkModel->__associations as $type1) { foreach($linkModel->{$type1} as $assoc1 => $assocData1) { $deepModel =& $linkModel->{$assocData1['className']}; if ($deepModel->alias != $model->name) { $tmpStack = $stack; $tmpStack[] = $assoc1; if ($linkModel->useDbConfig == $deepModel->useDbConfig) { $db =& $this; } else { $db =& ConnectionManager::getDataSource($deepModel->useDbConfig); } $db->queryAssociation($linkModel, $deepModel, $type1, $assoc1, $assocData1, $queryData, true, $fetch, $recursive - 1, $tmpStack); } } } } $this->__mergeAssociation($resultSet[$i], $fetch, $association, $type); } else { $tempArray[0][$association] = false; $this->__mergeAssociation($resultSet[$i], $tempArray, $association, $type); } } } }/** * Enter description here... * * @param unknown_type $data * @param unknown_type $merge * @param unknown_type $association * @param unknown_type $type */ function __mergeAssociation(&$data, $merge, $association, $type) { if (isset($merge[0]) && !isset($merge[0][$association])) { $association = Inflector::pluralize($association); } if ($type == 'belongsTo' || $type == 'hasOne') { if (isset($merge[$association])) { $data[$association] = $merge[$association][0]; } else { if (count($merge[0][$association]) > 1) { foreach($merge[0] as $assoc => $data2) { if ($assoc != $association) { $merge[0][$association][$assoc] = $data2; } } } if(!isset($data[$association])) { $data[$association] = $merge[0][$association]; } else { if(is_array($merge[0][$association])){ $data[$association] = array_merge($merge[0][$association], $data[$association]); } } } } else { if ($merge[0][$association] === false) { if(!isset($data[$association])){ $data[$association] = array(); } } else { foreach($merge as $i => $row) { if (count($row) == 1) { $data[$association][] = $row[$association]; } else { $tmp = array_merge($row[$association], $row); unset($tmp[$association]); $data[$association][] = $tmp; } } } } }/** * Enter description here... * * @param unknown_type $model * @param unknown_type $linkModel * @param unknown_type $type * @param unknown_type $association * @param unknown_type $assocData * @param unknown_type $queryData * @param unknown_type $external * @param unknown_type $resultSet * @return unknown */ function generateSelfAssociationQuery(&$model, &$linkModel, $type, $association = null, $assocData = array(), &$queryData, $external = false, &$resultSet) { $alias = $association; if (!isset($queryData['selfJoin'])) { $queryData['selfJoin'] = array(); $sql = 'SELECT ' . join(', ', $this->fields($model, $model->name, $queryData['fields'])); if($this->__bypass === false){ $sql .= ', '; $sql .= join(', ', $this->fields($linkModel, $alias, '')); } $sql .= ' FROM ' . $this->fullTableName($model) . ' ' . $this->alias . $this->name($model->name); $sql .= ' LEFT JOIN ' . $this->fullTableName($linkModel) . ' ' . $this->alias . $this->name($alias); $sql .= ' ON ' . $this->name($model->name) . '.' . $this->name($assocData['foreignKey']); $sql .= ' = ' . $this->name($alias) . '.' . $this->name($linkModel->primaryKey); if (!in_array($sql, $queryData['selfJoin'])) { $queryData['selfJoin'][] = $sql; return true; } } elseif (isset($linkModel)) { return $this->generateAssociationQuery($model, $linkModel, $type, $association, $assocData, $queryData, $external, $resultSet); } else { if (isset($this->__assocJoins)) { $replace = ', '; $replace .= join(', ', $this->__assocJoins['fields']); $replace .= ' FROM'; } else { $replace = 'FROM'; } $sql = $queryData['selfJoin'][0]; $sql .= ' ' . join(' ', $queryData['joins']); $sql .= $this->conditions($queryData['conditions']) . ' ' . $this->order($queryData['order']); $sql .= ' ' . $this->limit($queryData['limit'], $queryData['offset']); $result = preg_replace('/FROM/', $replace, $sql); return $result; } }/** * Enter description here... * * @param Model $model * @param unknown_type $linkModel * @param unknown_type $type * @param unknown_type $association * @param unknown_type $assocData * @param unknown_type $queryData * @param unknown_type $external * @param unknown_type $resultSet * @return unknown */ function generateAssociationQuery(&$model, &$linkModel, $type, $association = null, $assocData = array(), &$queryData, $external = false, &$resultSet) { $this->__scrubQueryData($queryData); $this->__scrubQueryData($assocData); $joinedOnSelf = false; if ($linkModel == null) { if (array_key_exists('selfJoin', $queryData)) { return $this->generateSelfAssociationQuery($model, $linkModel, $type, $association, $assocData, $queryData, $external, $resultSet); } else { if (isset($this->__assocJoins)) { $joinFields = ', '; $joinFields .= join(', ', $this->__assocJoins['fields']); } else { $joinFields = null; } $sql = 'SELECT '; if ($this->goofyLimit) { $sql .= $this->limit($queryData['limit'], $queryData['offset']); } $sql .= ' ' . join(', ', $this->fields($model, $model->name, $queryData['fields'])) . $joinFields . ' FROM '; $sql .= $this->fullTableName($model) . ' ' . $this->alias; $sql .= $this->name($model->name) . ' ' . join(' ', $queryData['joins']) . ' '; $sql .= $this->conditions($queryData['conditions']) . ' ' . $this->order($queryData['order']); if (!$this->goofyLimit) { $sql .= ' ' . $this->limit($queryData['limit'], $queryData['offset']); } } return $sql; } $alias = $association; if ($model->name == $linkModel->name) { $joinedOnSelf = true; } if ($external && isset($assocData['finderQuery'])) { if (!empty($assocData['finderQuery']) && $assocData['finderQuery'] != null) { return $assocData['finderQuery']; } } if (!$external && in_array($type, array('hasOne', 'belongsTo'))) { if ($this->__bypass === false) { $fields = join(', ', $this->fields($linkModel, $alias, $assocData['fields'])); $this->__assocJoins['fields'][] = $fields; } else { $this->__assocJoins = null; } } $limit = ''; if (isset($assocData['limit'])) { if (!isset($assocData['offset']) && isset($assocData['page'])) { $assocData['offset'] = ($assocData['page'] - 1) * $assocData['limit']; } elseif (!isset($assocData['offset'])) { $assocData['offset'] = null; } $limit = $this->limit($assocData['limit'], $assocData['offset']); } switch($type) { case 'hasOne': if ($external) { if (isset($queryData['limit']) && !empty($queryData['limit'])) { $limit = $this->limit($queryData['limit'], $queryData['offset']); } $sql = 'SELECT '; if ($this->goofyLimit) { $sql .= $limit; } $sql .= ' ' . join(', ', $this->fields($linkModel, $alias, $assocData['fields'])); $sql .= ' FROM ' . $this->fullTableName($linkModel) . ' ' . $this->alias . $this->name($alias) . ' '; $conditions = $queryData['conditions']; $condition = $this->name($alias) . '.' . $this->name($assocData['foreignKey']); $condition .= ' = {$__cakeForeignKey__$}'; if (is_array($conditions)) { $conditions[] = $condition; } else { $cond = $this->name($alias) . '.' . $this->name($assocData['foreignKey']); $cond .= ' = {$__cakeID__$}'; if (trim($conditions) != '') { $conditions .= ' AND '; } $conditions .= $cond; } $sql .= $this->conditions($conditions) . $this->order($queryData['order']); if (!$this->goofyLimit) { $sql .= $limit; } return $sql; } else { $sql = ' LEFT JOIN ' . $this->fullTableName($linkModel); $sql .= ' ' . $this->alias . $this->name($alias) . ' ON '; $sql .= $this->name($alias) . '.' . $this->name($assocData['foreignKey']); $sql .= ' = ' . $model->escapeField($model->primaryKey); if ($assocData['order'] != null) { $queryData['order'][] = $assocData['order']; } $this->__mergeConditions($queryData, $assocData); if (!in_array($sql, $queryData['joins'])) { $queryData['joins'][] = $sql; } return true; } break; case 'belongsTo': if ($external) { $sql = 'SELECT '; if ($this->goofyLimit) { $sql .= $limit; } $sql .= ' ' . join(', ', $this->fields($linkModel, $alias, $assocData['fields'])); $sql .= ' FROM ' . $this->fullTableName($linkModel) . ' ' . $this->alias . $this->name($alias) . ' '; $conditions = $assocData['conditions']; $condition = $this->name($alias) . '.' . $this->name($linkModel->primaryKey); $condition .= ' = {$__cakeForeignKey__$}'; if (is_array($conditions)) { $conditions[] = $condition; } else { if (trim($conditions) != '') { $conditions .= ' AND '; } $conditions .= $condition; } $sql .= $this->conditions($conditions) . $this->order($assocData['order']); if (!$this->goofyLimit) { $sql .= $limit; } return $sql; } else { $sql = ' LEFT JOIN ' . $this->fullTableName($linkModel); $sql .= ' ' . $this->alias . $this->name($alias) . ' ON '; $sql .= $this->name($model->name) . '.' . $this->name($assocData['foreignKey']); $sql .= ' = ' . $this->name($alias) . '.' . $this->name($linkModel->primaryKey); $this->__mergeConditions($queryData, $assocData); if (!in_array($sql, $queryData['joins'])) { $queryData['joins'][] = $sql; } return true; } break; case 'hasMany': $conditions = $assocData['conditions']; $sql = 'SELECT '; if ($this->goofyLimit) { $sql .= $limit; } $sql .= ' ' . join(', ', $this->fields($linkModel, $alias, $assocData['fields'])); $sql .= ' FROM ' . $this->fullTableName($linkModel) . ' ' . $this->alias . $this->name($alias); if (is_array($conditions)) { $conditions[$alias . '.' . $assocData['foreignKey']] = '{$__cakeID__$}'; } else { $cond = $this->name($alias) . '.' . $this->name($assocData['foreignKey']); $cond .= ' = {$__cakeID__$}'; if (trim($conditions) != '') { $conditions .= ' AND '; } $conditions .= $cond; } $sql .= $this->conditions($conditions); $sql .= $this->order($assocData['order']); if (!$this->goofyLimit) { $sql .= $limit; } return $sql; break; case 'hasAndBelongsToMany': $joinTbl = $this->fullTableName($assocData['joinTable']); $sql = 'SELECT '; if ($this->goofyLimit) { $sql .= $limit; } $joinFields = array(); if (isset($assocData['with']) && is_array($assocData['with']) && !empty($assocData['with'])) { $joinName = array_keys($assocData['with']); $joinFields = $assocData['with'][$joinName[0]]; if (is_array($joinFields) && !empty($joinFields)) { $joinFields = $this->fields($linkModel, $joinName[0], $joinFields); } else { $joinFields = array($this->name($joinName[0]) . '.*'); } } $sql .= ' ' . join(', ', am($this->fields($linkModel, $alias, $assocData['fields']), $joinFields)); $sql .= ' FROM ' . $this->fullTableName($linkModel) . ' ' . $this->alias . $this->name($alias); $sql .= ' JOIN ' . $joinTbl; $joinAssoc = $joinTbl; if (isset($assocData['with']) && is_array($assocData['with']) && !empty($assocData['with'])) { $joinAssoc = $joinName[0]; $sql .= $this->alias . $this->name($joinAssoc); } $sql .= ' ON ' . $this->name($joinAssoc); $sql .= '.' . $this->name($assocData['foreignKey']) . ' = {$__cakeID__$}'; $sql .= ' AND ' . $this->name($joinAssoc) . '.' . $this->name($assocData['associationForeignKey']); $sql .= ' = ' . $this->name($alias) . '.' . $this->name($linkModel->primaryKey); $sql .= $this->conditions($assocData['conditions']); $sql .= $this->order($assocData['order']); if (!$this->goofyLimit) { $sql .= $limit; } return $sql; break; } return null; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -