📄 dbo_source.php
字号:
$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 + -