Spec-Zone.ru › Yii 1.1

CMssqlCommandBuilder

Пакет system.db.schema.mssql
Наследование класс CMssqlCommandBuilder » CDbCommandBuilder » CComponent
Исходный код framework/db/schema/mssql/CMssqlCommandBuilder.php
CMssqlCommandBuilder предоставляет базовые методы для создания команд запросов к таблицам для серверов Mssql.

Общедоступные свойства

Свойство Тип Описание Определено
dbConnection CDbConnection соединение с базой данных. CDbCommandBuilder
schema CDbSchema схема для этого билдера команд. CDbCommandBuilder

Защищенные свойства

Свойство Тип Описание Определено
integerPrimaryKeyDefaultValue строка Возвращает значение по умолчанию для целочисленного/последовательного первичного ключа. Значение по умолчанию означает, что следующее CDbCommandBuilder

Публичные методы

Метод Описание Определено в
__call() Вызывает именованный метод, который не является методом класса. CComponent
__construct() CDbCommandBuilder
__get() Возвращает значение свойства, список обработчиков событий или поведение на основе его имени. CComponent
__isset() Проверяет, является ли значение свойства нулевым. CComponent
__set() Устанавливает значение свойства компонента. CComponent
__unset() Устанавливает свойство компонента в значение null. CComponent
applyCondition() Изменяет SQL для применения условия WHERE. CDbCommandBuilder
applyGroup() Изменяет SQL для применения GROUP BY. CDbCommandBuilder
applyHaving() Изменяет SQL для применения HAVING. CDbCommandBuilder
applyJoin() Изменяет SQL для применения условия JOIN. CMssqlCommandBuilder
applyLimit() Это порт из Prado Framework. CMssqlCommandBuilder
applyOrder() Изменяет SQL для применения ORDER BY. CDbCommandBuilder
asa() Возвращает объект поведения с заданным именем. CComponent
attachBehavior() Присоединяет поведение к этому компоненту. CComponent
attachBehaviors() Присоединяет список поведений к компоненту. CComponent
attachEventHandler() Присоединяет обработчик событий к событию. CComponent
bindValues() Связывает значения параметров для SQL-команды. CDbCommandBuilder
canGetProperty() Определяет, можно ли считать свойство. CComponent
canSetProperty() Определяет, можно ли установить свойство. CComponent
createColumnCriteria() Создаёт критерии запроса со значениями указанных столбцов. CDbCommandBuilder
createCountCommand() Создаёт команду COUNT(*) для одной таблицы. CMssqlCommandBuilder
createCriteria() Создаёт критерии запроса. CDbCommandBuilder
createDeleteCommand() Создаёт команду DELETE. CMssqlCommandBuilder
createFindCommand() Создаёт команду SELECT для одной таблицы. CMssqlCommandBuilder
createInCondition() Генерирует выражение для выбора строк с указанными значениями первичного ключа. CDbCommandBuilder
createInsertCommand() Создаёт команду INSERT. CDbCommandBuilder
createMultipleInsertCommand() Создаёт многократную команду INSERT. CDbCommandBuilder
createPkCondition() Генерирует выражение для выбора строк с указанными значениями первичного ключа. CDbCommandBuilder
createPkCriteria() Создаёт критерии запроса с указанным первичным ключом. CDbCommandBuilder
createSearchCondition() Генерирует выражение для поиска указанных ключевых слов в списке столбцов. CDbCommandBuilder
createSqlCommand() Создаёт команду на основе заданного SQL-запроса. CDbCommandBuilder
createUpdateCommand() Создаёт команду UPDATE. CMssqlCommandBuilder
createUpdateCounterCommand() Создаёт команду UPDATE, которая увеличивает/уменьшает определённые столбцы. CMssqlCommandBuilder
detachBehavior() Отсоединяет поведение от компонента. CComponent
detachBehaviors() Отсоединяет все поведения от компонента. CComponent
detachEventHandler() Отсоединяет существующий обработчик событий. CComponent
disableBehavior() Отключает присоединённое поведение. CComponent
disableBehaviors() Отключает все присоединённые к этому компоненту поведения. CComponent
enableBehavior() Включает присоединённое поведение. CComponent
enableBehaviors() Включает все присоединённые к этому компоненту поведения. CComponent
evaluateExpression() Вычисляет PHP-выражение или обратный вызов в контексте этого компонента. CComponent
getDbConnection() Возвращает подключение к базе данных. CDbCommandBuilder
getEventHandlers() Возвращает список присоединённых обработчиков событий для события. CComponent
getLastInsertID() Возвращает последний идентификатор вставки для указанной таблицы. CDbCommandBuilder
getSchema() Возвращает схему для этого генератора команд. CDbCommandBuilder
hasEvent() Определяет, определено ли событие. CComponent
hasEventHandler() Проверяет, имеет ли указанное событие присоединённые обработчики. CComponent
hasProperty() Определяет, определено ли свойство. CComponent
raiseEvent() Вызывает событие. CComponent

Защищенные методы

Метод Описание Определено в
checkCriteria() Проверяет, содержит ли условие запроса (criteria) предложение ORDER BY при использовании offset/limit. CMssqlCommandBuilder
composeMultipleInsertCommand() Создаёт команду INSERT для нескольких строк. CDbCommandBuilder
createCompositeInCondition() Генерирует выражение для выбора строк со значениями составного ключа. CMssqlCommandBuilder
ensureTable() Проверяет, является ли параметр корректной схемой таблицы. CDbCommandBuilder
findOrdering() Основано на упрощённом синтаксисе http://msdn2.microsoft.com/en-us/library/aa259187(SQL.80).aspx CMssqlCommandBuilder
getIntegerPrimaryKeyDefaultValue() Возвращает значение по умолчанию для целочисленного/последовательного первичного ключа. Значение по умолчанию означает, что следующее CDbCommandBuilder
joinOrdering() CMssqlCommandBuilder
reverseDirection() CMssqlCommandBuilder
rewriteLimitOffsetSql() Переписывает SQL-запрос для применения $limit > и $offset > 0 для базы данных MSSQL. CMssqlCommandBuilder

Подробное описание методов

applyJoin() метод

public string applyJoin(string $sql, string $join)
$sql строка SQL-запрос, который нужно изменить
$join строка строка с предложением JOIN (начинается с типа JOIN, например INNER JOIN)
{return} строка изменённый SQL-запрос
Исходный код: framework/db/schema/mssql/CMssqlCommandBuilder.php#143 (показать)
public function applyJoin($sql,$join)
{
    if(
trim($join)!=='')
        
$sql=preg_replace('/^\s*DELETE\s+FROM\s+((\[.+\])|([^\s]+))\s*/i',"DELETE \\1 FROM \\1",$sql);
    return 
parent::applyJoin($sql,$join);
}

Изменяет SQL-запрос для применения предложения JOIN. Переопределяет родительскую реализацию, чтобы соответствовать синтаксису команды DELETE, требуемому при ссылке на несколько таблиц.

applyLimit() метод

public string applyLimit(string $sql, integer $limit, integer $offset)
$sql строка строка SQL-запроса.
$limit целое число максимальное количество строк, -1 для игнорирования ограничения.
$offset целое число смещение строки, -1 для игнорирования смещения.
{return} строка SQL с ограничением и смещением.
Исходный код: framework/db/schema/mssql/CMssqlCommandBuilder.php#194 (показать)
public function applyLimit($sql, $limit, $offset)
{
    
$limit = $limit!==null ? (int)$limit : -1;
    
$offset = $offset!==null ? (int)$offset : -1;
    if (
$limit > 0 && $offset <= 0) //just limit
        
$sql = preg_replace('/^([\s(])*SELECT( DISTINCT)?(?!\s*TOP\s*\()/i',"\\1SELECT\\2 TOP $limit", $sql);
    elseif(
$limit > 0 && $offset > 0)
        
$sql = $this->rewriteLimitOffsetSql($sql, $limit,$offset);
    return 
$sql;
}

Это порт из Prado Framework.

Переопределяет родительскую реализацию. Изменяет sql для применения $limit и $offset. Идея ограничения со смещением заключается в модификации sql на лету с множеством предположений о структуре строки sql. Модификация выполняется со ссылкой на заметки из http://troels.arvin.dk/db/rdbms/#select-limit-offset

SELECT * FROM ( SELECT TOP n * FROM ( SELECT TOP z columns -- (z=n+skip) FROM tablename ORDER BY key ASC ) AS FOO ORDER BY key DESC -- ('FOO' may be anything) ) AS BAR ORDER BY key ASC -- ('BAR' may be anything)

Используются регулярные выражения для изменения SQL-запроса. Результирующий SQL-запрос может быть некорректным для сложных запросов. Применяются следующие ограничения

  • В частности, запятые не должны использоваться в качестве части выражения сортировки или идентификатора. Запятые должны использоваться только для разделения предложений сортировки.
  • В предложении ORDER BY имя столбца не должно квалифицироваться именем таблицы или представления. Именуйте столбцы или используйте индекс столбца.
  • После предложения ORDER BY не должно быть других предложений, например, COMPUTE или FOR.

checkCriteria() метод

protected CDbCriteria checkCriteria(CMssqlTableSchema $table, CDbCriteria $criteria)
$table CMssqlTableSchema схема таблицы
$criteria CDbCriteria условия запроса
{return} CDbCriteria изменённые условия запроса
Исходный код: framework/db/schema/mssql/CMssqlCommandBuilder.php#324 (показать)
protected function checkCriteria($table, $criteria)
{
    if (
$criteria->offset > 0 && $criteria->order==='')
    {
        
$criteria->order=is_array($table->primaryKey)?implode(',',$table->primaryKey):$table->primaryKey;
    }
    return 
$criteria;
}

Проверяет, содержит ли условие запроса (criteria) предложение ORDER BY при использовании offset/limit. Переопределяет родительскую реализацию для проверки наличия предложения orderby при запросе с offset. Если нет, сортирует по первичному ключу.

createCompositeInCondition() метод

protected string createCompositeInCondition(CDbTableSchema $table, array $values, string $prefix)
$table CDbTableSchema схема таблицы
$values массив список значений первичного ключа, которые должны быть выбраны
$prefix строка префикс столбца (заканчивается точкой)
{return} строка выражение для выбора
Исходный код: framework/db/schema/mssql/CMssqlCommandBuilder.php#340 (показать)
protected function createCompositeInCondition($table,$values,$prefix)
{
    
$vs=array();
    foreach(
$values as $value)
    {
        
$c=array();
        foreach(
$value as $k=>$v)
            
$c[]=$prefix.$table->columns[$k]->rawName.'='.$v;
        
$vs[]='('.implode(' AND ',$c).')';
    }
    return 
'('.implode(' OR ',$vs).')';
}

Генерирует выражение для выбора строк со значениями составного ключа.

createCountCommand() метод

public CDbCommand createCountCommand(CDbTableSchema $table, CDbCriteria $criteria, string $alias='t')
$table CDbTableSchema метаданные таблицы
$criteria CDbCriteria критерии запроса
$alias строка имя псевдонима основной таблицы. По умолчанию 't'.
{return} CDbCommand команда запроса.
Исходный код: framework/db/schema/mssql/CMssqlCommandBuilder.php#31 (показать)
public function createCountCommand($table,$criteria,$alias='t')
{
    
$criteria->order='';
    return 
parent::createCountCommand($table, $criteria,$alias);
}

Создаёт команду COUNT(*) для одной таблицы. Переопределяет родительскую реализацию, чтобы удалить предложение ORDER из условия запроса, если оно существует.

createDeleteCommand() метод

public CDbCommand createDeleteCommand(CDbTableSchema $table, CDbCriteria $criteria)
$table CDbTableSchema метаданные таблицы
$criteria CDbCriteria критерии запроса
{return} CDbCommand команда удаления.
Исходный код: framework/db/schema/mssql/CMssqlCommandBuilder.php#115 (показать)
public function createDeleteCommand($table,$criteria)
{
    
$criteria=$this->checkCriteria($table, $criteria);
    return 
parent::createDeleteCommand($table, $criteria);
}

Создаёт команду DELETE. Переопределяет родительскую реализацию, чтобы проверить, указано ли предложение orderby при запросе с offset.

createFindCommand() метод

public CDbCommand createFindCommand(CDbTableSchema $table, CDbCriteria $criteria, string $alias='t')
$table CDbTableSchema метаданные таблицы
$criteria CDbCriteria критерии запроса
$alias строка имя псевдонима основной таблицы. По умолчанию 't'.
{return} CDbCommand команда запроса.
Исходный код: framework/db/schema/mssql/CMssqlCommandBuilder.php#45 (показать)
public function createFindCommand($table,$criteria,$alias='t')
{
    
$criteria=$this->checkCriteria($table,$criteria);
    return 
parent::createFindCommand($table,$criteria,$alias);

}

Создаёт команду SELECT для отдельной таблицы. Переопределите реализацию родительского класса, чтобы проверить, указан ли порядок сортировки при запросе с смещением.

createUpdateCommand() метод

public CDbCommand createUpdateCommand(CDbTableSchema $table, array $data, CDbCriteria $criteria)
$table CDbTableSchema метаданные таблицы
$data массив список столбцов для обновления (имя=>значение)
$criteria CDbCriteria критерии запроса
{return} CDbCommand команда обновления.
Исходный код: framework/db/schema/mssql/CMssqlCommandBuilder.php#61 (показать)
public function createUpdateCommand($table,$data,$criteria)
{
    
$criteria=$this->checkCriteria($table,$criteria);
    
$fields=array();
    
$values=array();
    
$bindByPosition=isset($criteria->params[0]);
    
$i=0;
    foreach(
$data as $name=>$value)
    {
        if((
$column=$table->getColumn($name))!==null)
        {
            if (
$table->sequenceName !== null && $column->isPrimaryKey === true) continue;
            if (
$column->dbType === 'timestamp') continue;
            if(
$value instanceof CDbExpression)
            {
                
$fields[]=$column->rawName.'='.$value->expression;
                foreach(
$value->params as $n=>$v)
                    
$values[$n]=$v;
            }
            elseif(
$bindByPosition)
            {
                
$fields[]=$column->rawName.'=?';
                
$values[]=$column->typecast($value);
            }
            else
            {
                
$fields[]=$column->rawName.'='.self::PARAM_PREFIX.$i;
                
$values[self::PARAM_PREFIX.$i]=$column->typecast($value);
                
$i++;
            }
        }
    }
    if(
$fields===array())
        throw new 
CDbException(Yii::t('yii','No columns are being updated for table "{table}".',
            array(
'{table}'=>$table->name)));
    
$sql="UPDATE {$table->rawName} SET ".implode(', ',$fields);
    
$sql=$this->applyJoin($sql,$criteria->join);
    
$sql=$this->applyCondition($sql,$criteria->condition);
    
$sql=$this->applyOrder($sql,$criteria->order);
    
$sql=$this->applyLimit($sql,$criteria->limit,$criteria->offset);

    
$command=$this->getDbConnection()->createCommand($sql);
    
$this->bindValues($command,array_merge($values,$criteria->params));

    return 
$command;
}

Создаёт команду UPDATE. Переопределите реализацию родительского класса, так как mssql не хочет обновлять столбец с идентификатором.

createUpdateCounterCommand() метод

public CDbCommand createUpdateCounterCommand(CDbTableSchema $table, CDbCriteria $counters, array $criteria)
$table CDbTableSchema метаданные таблицы
$counters CDbCriteria критерии запроса
$criteria массив счётчики для обновления (приращения/уменьшения счётчиков, индексированные по именам столбцов.)
{return} CDbCommand созданная команда
Исходный код: framework/db/schema/mssql/CMssqlCommandBuilder.php#130 (показать)
public function createUpdateCounterCommand($table,$counters,$criteria)
{
    
$criteria=$this->checkCriteria($table, $criteria);
    return 
parent::createUpdateCounterCommand($table, $counters, $criteria);
}

Создаёт команду UPDATE, которая увеличивает/уменьшает определённые столбцы. Переопределите родительскую реализацию, чтобы проверить, указан ли порядок сортировки при запросе со смещением.

findOrdering() метод

protected array findOrdering(string $sql)
$sql строка $sql
{return} массив выражение сортировки в качестве ключа и направление сортировки в качестве значения
Исходный код: framework/db/schema/mssql/CMssqlCommandBuilder.php#234 (показать)
protected function findOrdering($sql)
{
    if(!
preg_match('/ORDER BY/i', $sql))
        return array();
    
$matches=array();
    
$ordering=array();
    
preg_match_all('/(ORDER BY)[\s"\[](.*)(ASC|DESC)?(?:[\s"\[]|$|COMPUTE|FOR)/i', $sql, $matches);
    if(
count($matches)>1 && count($matches[2]) > 0)
    {
        
$parts = explode(',', $matches[2][0]);
        foreach(
$parts as $part)
        {
            
$subs=array();
            if(
preg_match_all('/(.*)[\s"\]](ASC|DESC)$/i', trim($part), $subs))
            {
                if(
count($subs) > 1 && count($subs[2]) > 0)
                {
                    
$name='';
                    foreach(
explode('.', $subs[1][0]) as $p)
                    {
                        if(
$name!=='')
                            
$name.='.';
                        
$name.='[' . trim($p, '[]') . ']';
                    }
                    
$ordering[$name] = $subs[2][0];
                }
                
//else what?
            
}
            else
                
$ordering[trim($part)] = 'ASC';
        }
    }

    
// replacing column names with their alias names
    
foreach($ordering as $name => $direction)
    {
        
$matches = array();
        
$pattern = '/\s+'.str_replace(array('[',']'), array('\[','\]'), $name).'\s+AS\s+(\[[^\]]+\])/i';
        
preg_match($pattern, $sql, $matches);
        if(isset(
$matches[1]))
        {
            
$ordering[$matches[1]] = $ordering[$name];
            unset(
$ordering[$name]);
        }
    }

    return 
$ordering;
}

Основано на упрощённом синтаксисе http://msdn2.microsoft.com/en-us/library/aa259187(SQL.80).aspx

joinOrdering() метод

protected string joinOrdering(array $orders, string $newPrefix)
$orders массив полученный из findOrdering() порядок сортировки
$newPrefix строка новое префикс таблицы для столбцов сортировки
{return} строка склеенные выражения сортировки
Исходный код: framework/db/schema/mssql/CMssqlCommandBuilder.php#290 (показать)
protected function joinOrdering($orders, $newPrefix)
{
    if(
count($orders)>0)
    {
        
$str=array();
        foreach(
$orders as $column => $direction)
            
$str[] = $column.' '.$direction;
        
$orderBy = 'ORDER BY '.implode(', ', $str);
        return 
preg_replace('/\s+\[[^\]]+\]\.(\[[^\]]+\])/i', ' '.$newPrefix.'.\1', $orderBy);
    }
}

reverseDirection() метод

protected array reverseDirection(array $orders)
$orders массив исходный порядок сортировки
{return} массив порядок сортировки с изменённым направлением.
Исходный код: framework/db/schema/mssql/CMssqlCommandBuilder.php#308 (показать)
protected function reverseDirection($orders)
{
    foreach(
$orders as $column => $direction)
        
$orders[$column] = strtolower(trim($direction))==='desc' ? 'ASC' : 'DESC';
    return 
$orders;
}

rewriteLimitOffsetSql() метод

protected string rewriteLimitOffsetSql(string $sql, integer $limit, integer $offset)
$sql строка запрос sql
$limit целое число $limit > 0
$offset целое число $offset > 0
{return} строка изменённый sql-запрос, применённый с ограничением и смещением.
Исходный код: framework/db/schema/mssql/CMssqlCommandBuilder.php#215 (показать)
protected function rewriteLimitOffsetSql($sql, $limit, $offset)
{
    
$fetch = $limit+$offset;
    
$sql = preg_replace('/^([\s(])*SELECT( DISTINCT)?(?!\s*TOP\s*\()/i',"\\1SELECT\\2 TOP $fetch", $sql);
    
$ordering = $this->findOrdering($sql);
    
$originalOrdering = $this->joinOrdering($ordering, '[__outer__]');
    
$reverseOrdering = $this->joinOrdering($this->reverseDirection($ordering), '[__inner__]');
    
$sql = "SELECT * FROM (SELECT TOP {$limit} * FROM ($sql) as [__inner__] {$reverseOrdering}) as [__outer__] {$originalOrdering}";
    return 
$sql;
}

Переписывает sql, чтобы применить $limit > и $offset > 0 для базы данных MSSQL. См. http://troels.arvin.dk/db/rdbms/#select-limit-offset

© 2008–2017 by Yii Software LLC
Licensed under the three clause BSD license.
http://www.yiiframework.com/doc/api/1.1/CMssqlCommandBuilder

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API