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 для игнорирования ограничения.
Переопределяет родительскую реализацию. Изменяет 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.
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. Если нет, сортирует по первичному ключу.
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).')'; }
Генерирует выражение для выбора строк со значениями составного ключа.
public function createCountCommand($table,$criteria,$alias='t') { $criteria->order=''; return parent::createCountCommand($table, $criteria,$alias); }
Создаёт команду COUNT(*) для одной таблицы. Переопределяет родительскую реализацию, чтобы удалить предложение ORDER из условия запроса, если оно существует.
public function createDeleteCommand($table,$criteria) { $criteria=$this->checkCriteria($table, $criteria); return parent::createDeleteCommand($table, $criteria); }
Создаёт команду DELETE. Переопределяет родительскую реализацию, чтобы проверить, указано ли предложение orderby при запросе с offset.
public function createFindCommand($table,$criteria,$alias='t') { $criteria=$this->checkCriteria($table,$criteria); return parent::createFindCommand($table,$criteria,$alias);
}
Создаёт команду SELECT для отдельной таблицы. Переопределите реализацию родительского класса, чтобы проверить, указан ли порядок сортировки при запросе с смещением.
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}
массив
выражение сортировки в качестве ключа и направление сортировки в качестве значения