/** * Normalize field * * @param Model $model Model * @param string $field Name of the field * @return string */ private function normalizeField(Model $model, $field) { // @codingStandardsIgnoreLine if ($model->hasField($field)) { $field = $model->alias . '.' . $field; } elseif ($model->isVirtualField($field)) { $db = $model->getDataSource(); $field = $model->getVirtualField($field); $field = $db->dispatchMethod('_quoteFields', array($field)); $field = '(' . $field . ')'; } return $field; }
/** * Create a GROUP BY SQL clause. * * @param string|array $fields Group By fields * @param Model $Model The model to get group by fields for. * @return string Group By clause or null. */ public function group($fields, Model $Model = null) { if (empty($fields)) { return null; } if (!is_array($fields)) { $fields = array($fields); } if ($Model !== null) { foreach ($fields as $index => $key) { if ($Model->isVirtualField($key)) { $fields[$index] = '(' . $Model->getVirtualField($key) . ')'; } } } $fields = implode(', ', $fields); return ' GROUP BY ' . $this->_quoteFields($fields); }
/** * Returns an SQL calculation, i.e. COUNT() or MAX() * * @param Model $Model The model to get a calculated field for. * @param string $func Lowercase name of SQL function, i.e. 'count' or 'max' * @param array $params Function parameters (any values must be quoted manually) * * @return string An SQL calculation function */ public function calculate(Model $Model, $func, $params = array()) { $params = (array) $params; switch (strtolower($func)) { case 'count': if (!isset($params[0])) { $params[0] = '*'; } if (!isset($params[1])) { $params[1] = 'count'; } if ($Model->isVirtualField($params[0])) { $arg = $this->_quoteFields($Model->getVirtualField($params[0])); } else { $arg = $this->name($params[0]); } return 'COUNT(' . $arg . ') AS ' . $this->name($params[1]); case 'max': case 'min': if (!isset($params[1])) { $params[1] = $params[0]; } if ($Model->isVirtualField($params[0])) { $arg = $this->_quoteFields($Model->getVirtualField($params[0])); } else { $arg = $this->name($params[0]); } return strtoupper($func) . '(' . $arg . ') AS ' . $this->name($params[1]); } }