⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dbo_source.php

📁 Cake Framwork , Excellent
💻 PHP
📖 第 1 页 / 共 5 页
字号:
						$merged[$association][] = $data[$association];					}				}				$count++;			}			if (isset($value[$model->alias])) {				$resultSet[$i] = Set::pushDiff($resultSet[$i], $merged);				unset($merged);			}		}	}/** * Enter description here... * * @param unknown_type $data * @param unknown_type $merge * @param unknown_type $association * @param unknown_type $type * @param boolean $selfJoin */	function __mergeAssociation(&$data, $merge, $association, $type, $selfJoin = false) {		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])) {					if ($merge[0][$association] != null) {						$data[$association] = $merge[0][$association];					} else {						$data[$association] = array();					}				} else {					if (is_array($merge[0][$association])) {						foreach ($data[$association] as $k => $v) {							if (!is_array($v)) {								$dataAssocTmp[$k] = $v;							}						}						foreach ($merge[0][$association] as $k => $v) {							if (!is_array($v)) {								$mergeAssocTmp[$k] = $v;							}						}						$dataKeys = array_keys($data);						$mergeKeys = array_keys($merge[0]);						if ($mergeKeys[0] === $dataKeys[0] || $mergeKeys === $dataKeys) {							$data[$association][$association] = $merge[0][$association];						} else {							$diff = Set::diff($dataAssocTmp, $mergeAssocTmp);							$data[$association] = array_merge($merge[0][$association], $diff);						}					} elseif ($selfJoin && array_key_exists($association, $merge[0])) {						$data[$association] = array_merge($data[$association], array($association => array()));					}				}			}		} 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;					}				}			}		}	}/** * Generates an array representing a query or part of a query from a single model or two associated models * * @param Model $model * @param Model $linkModel * @param string $type * @param string $association * @param array $assocData * @param array $queryData * @param boolean $external * @param array $resultSet * @return mixed */	function generateAssociationQuery(&$model, &$linkModel, $type, $association = null, $assocData = array(), &$queryData, $external = false, &$resultSet) {		$queryData = $this->__scrubQueryData($queryData);		$assocData = $this->__scrubQueryData($assocData);		if (empty($queryData['fields'])) {			$queryData['fields'] = $this->fields($model, $model->alias);		} elseif (!empty($model->hasMany) && $model->recursive > -1) {			$assocFields = $this->fields($model, $model->alias, array("{$model->alias}.{$model->primaryKey}"));			$passedFields = $this->fields($model, $model->alias, $queryData['fields']);			if (count($passedFields) === 1) {				$match = strpos($passedFields[0], $assocFields[0]);				$match1 = strpos($passedFields[0], 'COUNT(');				if ($match === false && $match1 === false) {					$queryData['fields'] = array_merge($passedFields, $assocFields);				} else {					$queryData['fields'] = $passedFields;				}			} else {				$queryData['fields'] = array_merge($passedFields, $assocFields);			}			unset($assocFields, $passedFields);		}		/* Saving for later refactor			$tmpModel =& $model;			if ($linkModel != null) {				$tmpModel =& $linkModel;			}			foreach ($tmpModel->schema() as $field => $info) {				if ($info['type'] == 'boolean') {			 		$this->_booleans[$tmpModel->alias][] = $field;			 	}			}			unset($tmpModel);		*/		if ($linkModel == null) {			return $this->buildStatement(				array(					'fields' => array_unique($queryData['fields']),					'table' => $this->fullTableName($model),					'alias' => $model->alias,					'limit' => $queryData['limit'],					'offset' => $queryData['offset'],					'joins' => $queryData['joins'],					'conditions' => $queryData['conditions'],					'order' => $queryData['order'],					'group' => $queryData['group']				),				$model			);		}		if ($external && !empty($assocData['finderQuery'])) {			return $assocData['finderQuery'];		}		$alias = $association;		$self = ($model->name == $linkModel->name);		$fields = array();		if ((!$external && in_array($type, array('hasOne', 'belongsTo')) && $this->__bypass === false) || $external) {			$fields = $this->fields($linkModel, $alias, $assocData['fields']);		}		if (empty($assocData['offset']) && !empty($assocData['page'])) {			$assocData['offset'] = ($assocData['page'] - 1) * $assocData['limit'];		}		$assocData['limit'] = $this->limit($assocData['limit'], $assocData['offset']);		switch($type) {			case 'hasOne':			case 'belongsTo':				$conditions = $this->__mergeConditions(					$assocData['conditions'],					$this->getConstraint($type, $model, $linkModel, $alias, array_merge($assocData, compact('external', 'self')))				);				if ($external) {					$query = array_merge($assocData, array(						'conditions' => $conditions,						'table' => $this->fullTableName($linkModel),						'fields' => $fields,						'alias' => $alias,						'group' => null					));					$query = array_merge(array('order' => $assocData['order'], 'limit' => $assocData['limit']), $query);				} else {					$join = array(						'table' => $this->fullTableName($linkModel),						'alias' => $alias,						'type' => isset($assocData['type']) ? $assocData['type'] : 'LEFT',						'conditions' => trim($this->conditions($conditions, true, false, $model))					);					$queryData['fields'] = array_merge($queryData['fields'], $fields);					if (!empty($assocData['order'])) {						$queryData['order'][] = $assocData['order'];					}					if (!in_array($join, $queryData['joins'])) {						$queryData['joins'][] = $join;					}					return true;				}			break;			case 'hasMany':				$assocData['fields'] = $this->fields($linkModel, $alias, $assocData['fields']);				if (!empty($assocData['foreignKey'])) {					$assocData['fields'] = array_merge($assocData['fields'], $this->fields($linkModel, $alias, array("{$alias}.{$assocData['foreignKey']}")));				}				$query = array(					'conditions' => $this->__mergeConditions($this->getConstraint('hasMany', $model, $linkModel, $alias, $assocData), $assocData['conditions']),					'fields' => array_unique($assocData['fields']),					'table' => $this->fullTableName($linkModel),					'alias' => $alias,					'order' => $assocData['order'],					'limit' => $assocData['limit'],					'group' => null				);			break;			case 'hasAndBelongsToMany':				$joinFields = array();				$joinAssoc = null;				if (isset($assocData['with']) && !empty($assocData['with'])) {					$joinKeys = array($assocData['foreignKey'], $assocData['associationForeignKey']);					list($with, $joinFields) = $model->joinModel($assocData['with'], $joinKeys);					$joinTbl = $this->fullTableName($model->{$with});					$joinAlias = $joinTbl;					if (is_array($joinFields) && !empty($joinFields)) {						$joinFields = $this->fields($model->{$with}, $model->{$with}->alias, $joinFields);						$joinAssoc = $joinAlias = $model->{$with}->alias;					} else {						$joinFields = array();					}				} else {					$joinTbl = $this->fullTableName($assocData['joinTable']);					$joinAlias = $joinTbl;				}				$query = array(					'conditions' => $assocData['conditions'],					'limit' => $assocData['limit'],					'table' => $this->fullTableName($linkModel),					'alias' => $alias,					'fields' => array_merge($this->fields($linkModel, $alias, $assocData['fields']), $joinFields),					'order' => $assocData['order'],					'group' => null,					'joins' => array(array(						'table' => $joinTbl,						'alias' => $joinAssoc,						'conditions' => $this->getConstraint('hasAndBelongsToMany', $model, $linkModel, $joinAlias, $assocData, $alias)					))				);			break;		}		if (isset($query)) {			return $this->buildStatement($query, $model);		}		return null;	}/** * Returns a conditions array for the constraint between two models * * @param string $type Association type * @param object $model Model object * @param array $association Association array * @return array Conditions array defining the constraint between $model and $association */	function getConstraint($type, $model, $linkModel, $alias, $assoc, $alias2 = null) {		$assoc = array_merge(array('external' => false, 'self' => false), $assoc);		if (array_key_exists('foreignKey', $assoc) && empty($assoc['foreignKey'])) {			return array();		}		switch (true) {			case ($assoc['external'] && $type == 'hasOne'):				return array("{$alias}.{$assoc['foreignKey']}" => '{$__cakeID__$}');			break;			case ($assoc['external'] && $type == 'belongsTo'):				return array("{$alias}.{$linkModel->primaryKey}" => '{$__cakeForeignKey__$}');			break;			case (!$assoc['external'] && $type == 'hasOne'):				return array("{$alias}.{$assoc['foreignKey']}" => $this->identifier("{$model->alias}.{$model->primaryKey}"));			break;			case (!$assoc['external'] && $type == 'belongsTo'):				return array("{$model->alias}.{$assoc['foreignKey']}" => $this->identifier("{$alias}.{$linkModel->primaryKey}"));			break;			case ($type == 'hasMany'):				return array("{$alias}.{$assoc['foreignKey']}" => array('{$__cakeID__$}'));			break;			case ($type == 'hasAndBelongsToMany'):				return array(					array("{$alias}.{$assoc['foreignKey']}" => '{$__cakeID__$}'),					array("{$alias}.{$assoc['associationForeignKey']}" => $this->identifier("{$alias2}.{$linkModel->primaryKey}"))				);			break;		}		return array();	}/** * Builds and generates a JOIN statement from an array.  Handles final clean-up before conversion. * * @param array $join An array defining a JOIN statement in a query * @return string An SQL JOIN statement to be used in a query * @see DboSource::renderJoinStatement() * @see DboSource::buildStatement() */	function buildJoinStatement($join) {		$data = array_merge(array(			'type' => null,			'alias' => null,			'table' => 'join_table',			'conditions' => array()		), $join);		if (!empty($data['alias'])) {			$data['alias'] = $this->alias . $this->name($data['alias']);		}		if (!empty($data['conditions'])) {			$data['conditions'] = trim($this->conditions($data['conditions'], true, false));		}		return $this->renderJoinStatement($data);	}/** * Builds and generates an SQL statement from an array.  Handles final clean-up before conversion. * * @param array $query An array defining an SQL query * @param object $model The model object which initiated the query * @return string An executable SQL statement * @see DboSource::renderStatement() */	function buildStatement($query, $model) {		$query = array_merge(array('offset' => null, 'joins' => array()), $query);		if (!empty($query['joins'])) {			for ($i = 0; $i < count($query['joins']); $i++) {				if (is_array($query['joins'][$i])) {					$query['joins'][$i] = $this->buildJoinStatement($query['joins'][$i]);				}			}		}		return $this->renderStatement('select', array(			'conditions' => $this->conditions($query['conditions'], true, true, $model),			'fields' => join(', ', $query['fields']),			'table' => $query['table'],			'alias' => $this->alias . $this->name($query['alias']),			'order' => $this->order($query['order']),			'limit' => $this->limit($query['limit'], $query['offset']),			'joins' => join(' ', $query['joins']),			'group' => $this->group($query['group'])		));	}/** * Renders a final SQL JOIN statement * * @param array $data * @return string */	function renderJoinStatement($data) {		extract($data);		return trim("{$type} JOIN {$table} {$alias} ON ({$conditions})");	}/** * Renders a final SQL statement by putting together the component parts in the correct order * * @param string $type * @param array $data * @return string */	function renderStatement($type, $data) {		extract($data);		$aliases = null;		switch (strtolower($type)) {			case 'select':				return "SELECT {$fields} FROM {$table} {$alias} {$joins} {$conditions} {$group} {$order} {$limit}";			break;			case 'update':				if (!empty($alias)) {					$aliases = "{$this->alias}{$alias} {$joins} ";				}				return "UPDATE {$table} {$aliases}SET {$fields} {$conditions}";			break;			case 'delete':				if (!empty($alias)) {					$aliases = "{$this->alias}{$alias} {$joins} ";				}				return "DELETE {$alias} FROM {$table} {$aliases}{$conditions}";			break;			case 'schema':				foreach (array('columns', 'indexes') as $var) {					if (is_array(${$var})) {						${$var} = "\t" . join(",\n\t", array_filter(${$var}));					}				}				if (trim($indexes) != '') {					$columns .= ',';				}				return "CREATE TABLE {$table} (\n{$columns}{$indexes});";			break;			case 'alter':			break;		}	}/** * Merges a mixed set of string/array conditions * * @return array */	function __mergeConditions($query, $assoc) {		if (!empty($assoc)) {			if (is_array($query)) {				return array_merge((array)$assoc, $query);			} else {				if (!empty($query)) {					$query = array($query);					if (is_array($assoc)) {						$query = array_merge($query, $assoc);					} else {						$query[] = $assoc;					}					return $query;				} else {					return $assoc;				}			}		}		return $query;	}/** * Generates and executes an SQL UPDATE statement for given model, fields, and values. * For databases that do not support aliases in UPDATE queries. * * @param Model $model * @param array $fields * @param array $values * @param mixed $conditions

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -