Примеры использования CDbCriteria в Yii

Yii
/
2013-09-21 23:09
Просмотры: 35735

yii CDbCriteriaCDbCriteria - это набор правил, критериев, по которым строится запрос, обычно SQL. Например, сортировка - order by, смещение offset, ограничение - limit.

Может использоваться в методах ActiveRecord, например в: CActiveRecord::find и CActiveRecord::findAll.

Простой пример выборки, для модели Post:

$criteria=new CDbCriteria();

$criteria->compare('status',Post::STATUS_ACTIVE);

$criteria->addInCondition('id',array(1,2,3,4,5,6));

$posts = Post::model()->findAll($criteria);

Свойства CDbCriteria:

Название Тип Описание
alias string Псевдоним таблицы. Если не установлен, используется строка "t"
condition string Условие запроса. Добавляется в оператор WHERE в SQL-выражении. Например, "age>31 AND team=1"
distinct boolean Выбирать ли только неповторяющиеся строки данных. Если равно true, оператор SELECT будет изменен на SELECT DISTINCT
group string Правило группировки результатов запроса. Добавляется в оператор GROUP BY в SQL-выражении. Например, "projectID, teamID"
having string Выражение, выполняемое с оператором GROUP BY. Например, "SUM(revenue)<50000"
index string Имя AR-атрибута, значение которого должно использоваться в качестве индекса массива результата запроса. По умолчанию - null, т.е., массив результата будет иметь целочисленные индексы, начинающиеся с нуля
join string Правило объединения с другими таблицами. Добавляется в оператор JOIN в SQL-выражении. Например, "LEFT JOIN users ON users.id=authorID"
limit integer Mаксимальное количество возвращаемых записей. Если меньше 0, то ограничений нет
offset integer Смещение (начиная с нуля), с которого будут возвращаться записи. Если меньше 0, то выборка начинается от начала
order string Правило сортировки результатов запроса. Добавляется в оператор ORDER BY в SQL-выражении
paramCount integer Глобальный счетчик анонимных связанных параметров. Данный счетчик используется для генерации имен анонимных параметров
params array Список значений параметров запроса, индексированных по меткам параметров. Например, "array(':name'=>'Dan', ':age'=>31)"
scopes mixed Применяемая группа условий.
Свойство имеет значение только если критерий передан в качестве параметра
в один из следующих методов объекта класса CActiveRecord:
CActiveRecord::find()
CActiveRecord::findAll()
CActiveRecord::findByPk()
CActiveRecord::findAllByPk()
CActiveRecord::findByAttributes()
CActiveRecord::findAllByAttributes()
CActiveRecord::count()
Может быть установлено одним из следующих способов:
Одна группа условий: $criteria->scopes='scopeName';
Несколько групп условий: $criteria->scopes=array(
'scopeName1',
'scopeName2');
Группа условий с параметрами: $criteria->scopes=array('scopeName'=>array($params));
Несколько групп условий с параметрами: $criteria->scopes=array(
'scopeName1'=>array($params1),
'scopeName2'=>array($params2));
Несколько групп условий с одним именем и разными параметрами: array(
array('scopeName'=>array($params1)),
array('scopeName'=>array($params2))
);
select mixed Выбираемые столбцы. Добавляется в оператор SELECT в SQL-выражении. Свойство может быть либо строкой (разделенные запятыми имена столбцов) либо массивом имен столбцов. По умолчанию - '*', т.е., выбираются все столбцы
together boolean Должны ли внешние таблицы быть связаны с первичной таблицей
в одном SQL-запросе. Свойство используется только в Active
Record-запросах для связей HAS_MANY и MANY_MANY.
Если данное свойство установлено в значение true, то для реляционного
AR-запроса будет выполнен лишь один SQL-запрос, даже если первичная
таблица лимитирована (установлено ограничение количества записей) и
связь между внешней и первичной таблицами является связью
многие-к-одному.
Если данное свойство установлено в значение false, для каждой связи
HAS_MANY будет выполнен отдельный SQL-запрос.
Если данное свойство не установлено при лимитировании первичной таблицы
или использовании постраничной разбивки, то для каждой связи HAS_MANY
будет выполнен отдельный SQL-запрос, иначе будет выполнен единственный
SQL-запрос
with mixed Реляционный критерий запроса. Используется для получения связанных объектов в режиме "жадной" загрузки. Свойство имеет значение только если критерий передан в качестве параметра в один из следующих методов объекта класса CActiveRecord:
CActiveRecord::find()
CActiveRecord::findAll()
CActiveRecord::findByPk()
CActiveRecord::findAllByPk()
CActiveRecord::findByAttributes()
CActiveRecord::findAllByAttributes()
CActiveRecord::count()
Значение свойства будет использовано в качестве параметра метода CActiveRecord::with() для выполнения "жадной" загрузки. Обратитесь к описанию метода CActiveRecord::with() за подробностями настройки данного параметра

Методы CDbCriteria:

Название Параметры Описание
__construct($data=array()) $data начальные значения параметров критерия (индексированы по именам свойств) Конструктор
__wakeup()   Переименовывает (remaps) параметры критерия при десериализации для предотвращения коллизий имен
addBetweenCondition($column, $valueStart, $valueEnd, $operator='AND')

$column имя столбца поиска

$valueStart начальное значение диапазона

$valueEnd конечное значение диапазона

$operator оператор, используемый для соединения нового условия с имеющимся. По умолчанию - 'AND'

Добавляет условие between (диапазон).
Новое условие диапазон и имеющееся будут соединены определенным оператором, по умолчанию -
оператор 'AND'. Если одно или оба значения пусты, то условие не будет добавлено к существующему.
Данный метод обрабатывает случай, при котором существующее условие пусто.
После вызова данного метода, свойство condition будет изменено
addColumnCondition($columns, $columnOperator='AND', $operator='AND')

$columns список имен столбцов и сравниваемых значений (имя => значение)

$columnOperator оператор для соединения нескольких столбцов в условии сравнения. По умолчанию - 'AND'

$operator оператор, используемый для соединения нового условия с имеющимся. По умолчанию - 'AND'

Добавляет условие для сравнения переданного списка со значениями столбцов. Данное условие и имеющееся будут соединены определенным оператором, по умолчанию - оператор 'AND'. Условие генерируется сравнением каждого столбца соответствующему значению
addCondition($condition, $operator='AND')

$condition новое условие. Может быть либо строкой либо массивом строк

$operator оператор соединения отдельных условий. По умолчанию - 'AND'

Добавляет условие к уже имеющемуся (condition).
Новое условие и имеющееся будут соединены определенным оператором, по умолчанию -
это оператор 'AND'. Новое условие может быть массивом. В этом случае все элементы массива
будут соединены оператором. Данный метод обрабатывает случай, когда существующее условие пусто.
После вызова метода, свойство condition будет изменено

addInCondition($column, $values, $operator='AND')

$column имя столбца (или допустимое SQL-выражение)

$values список значений, среди которых должно быть значение столбца

$operator оператор, используемый для соединения нового условия с имеющимся. По умолчанию - 'AND'

Добавляет условие IN к уже имеющемуся (condition).
Условие IN и имеющееся будут соединены определенным оператором, по умолчанию -
оператор 'AND'. Условие IN генерируется с использованием SQL-оператора IN, требующим,
чтобы значение определенного столбца находилось в переданном списке значений
addNotInCondition($column, $values, $operator='AND')

$column имя столбца (или допустимое SQL-выражение)

$values список значений, среди которых НЕ должно быть значение столбца

$operator оператор, используемый для соединения нового условия с имеющимся. По умолчанию - 'AND'

Добавляет условие NOT IN к уже имеющемуся (condition).
Условие NOT IN и имеющееся будут соединены определенным оператором, по умолчанию -
оператор 'AND'. Условие IN генерируется с использованием SQL-оператора IN, требующим,
чтобы значение определенного столбца НЕ находилось в переданном списке значений
addSearchCondition($column, $keyword, $escape=true, $operator='AND', $like='LIKE')

$column имя столбца (или допустимое SQL-выражение)

$keyword слово для поиска. Эта интерпретация слов для поиска зависит от следующих параметров

$escape экранировать ли слово для поиска, если оно содержит символы % или _.
Если данный параметр имеет значение true (по умолчанию), специальные символы % (обозначает 0 или более символов)
и _ (обозначает 1 символ) будут экранированы, а слово для поиска будет окружено символом % с обоих концов.
Если данный параметр имеет значение false, слово по умолчанию будет напрямую использоваться для поиска соответствий
без каких-либо изменений.

$operator оператор, используемый для соединения нового условия с имеющимся. По умолчанию - 'AND'

$like оператор LIKE. По умолчанию - 'LIKE'. Можно установить в значение 'NOT LIKE'

Добавляет условие поиска к уже имеющемуся (condition).
Условие поиска и имеющееся будут соединены определенным оператором, по умолчанию -
оператор 'AND'. Условие поиска генерируется с использованием SQL-оператора LIKE
с переданным именем и словом для поиска
compare($column, $value, $partialMatch=false, $operator='AND', $escape=true)

Оператор сравнения определяется интеллектуально на основе первых нескольких символов переданного значения.
В частности, распознаются следующие операторы, стоящие в начале переданного значения:<: значение столбца должно быть меньше переданного значения;
>: значение столбца должно быть больше переданного значения;
<=: значение столбца должно быть меньше либо равно переданному значению;
>=: значение столбца должно быть больше либо равно переданному значению;
<>: значение столбца не должно равняться переданному значению.
Примечание: если параметр $partialMatch равен значению true, то значение не должно являться подстрокой
значения столбца;
=: значение столбца должно равняться переданному значению;
ни один из вышеперечисленных: значение столбца должно равняться переданному значению. Примечание:
если параметр $partialMatch равен значению true, то значение столбца должно быть таким же, как переданное значение
или быть подстрокой переданного значения.

Примечание: окружающие пробелы будут удалены из значения перед сравнением.
Если значение пусто, выражение сравнения не будет добавлено к условию поиска.

$column имя столбца для поиска

$value значение, с которым производится сравнение. Если значение является строкой, то
будет выполнено интеллектуальное сравнение. Если значение - это массив, то производится точное сравнение
по каждому элементу массива. Если параметр пуст, то существующее условие поиска не будет изменено

$partialMatch надо ли проверять значение на частичное совпадение (используя операторы LIKE и NOT LIKE).
По умолчанию - false, т.е., проверяется точное совпадение

$operator оператор, используемый для соединения нового условия с имеющимся. По умолчанию - 'AND'

$escape должно ли значение экранироваться, если свойство $partialMatch установлено в значение true и
значение содержит символы % или _. Если данный параметр установлен в значение true (по умолчанию),
то специальные символы % (соответствует 0 или более символам) и _ (соответствует единственному символу)
будут экранированы и значение будет окружено символами % с обеих сторон. Если данный параметр имеет
значение false, то значение будет использовано для поиска соответствий напрямую без изменений

Добавляет выражение сравнения к свойству condition.
Данный метод - это хелпер, добавляющий новое выражение сравнения к свойству condition.
Действие производится сравнением столбца с переданным значением с
использованием некоторого оператора сравнения.
mergeWith($criteria, $useAnd=true)

$criteria критерий, с котором производится слияние. Может быть массивом или объектом класса CDbCriteria

$useAnd использовать ли оператор 'AND' для слияния условий и их опций. Если значение равно false, то будет использоваться оператор 'OR'. По умолчанию - true

Сливает критерий с другим.
В основном, слияние делает результирующий критерий более ограничивающим.
Например, если оба критерия имеют условия, вместе они будут слиты оператором 'AND'.
Также, критерий, переданный в метод в качестве параметра, имеет преимущество в случае, когда
пара опций не может быть слита (например, LIMIT, OFFSET)
toArray()   Представление критерия в виде массива

Примеры

// создаем экземпляр  класса CDbCriteria
$criteria = new CDbCriteria;
// выбираемые все столбцы из всех таблиц, участвующих в запросе
$criteria->select = '*';
//$criteria->select = array('post.id', 'post.category_id', 'post.user_id', 'post.title', 'user.name');
//$criteria->select = 'post.id, post.category_id, post.user_id, post.title, user.name';
// псевдоним(алиас) для текущей таблицы
$criteria->alias = 'post';
// выбираем только неповторяющиеся строки данных
$criteria->distinct = true;
// задаем условие запроса
$criteria->condition = 'post.is_hide = :is_hide AND post.user_id = :author_id';
// группируем
$criteria->group = 'post.category_id';
// условие для GROUP BY
$criteria->having = 'post.viwed > 100';
// задаем соединение с другой(ими) таблицами
$criteria->join = 'LEFT JOIN users as user ON user.id = post.user_id';
// максимальное количество возвращаемых записей
$criteria->limit = 20;
// смещение, с которого будут возвращаться записи
$criteria->offset = 5;
// сортировки результатов запроса
$criteria->order = 'post.date_create';
// параметры для замены в SQL выражении, для condition
$criteria->params = array(':is_hide'=>0, ':author_id'=>Yii::app()->user->id);
// внешние таблицы должны быть связаны с первичной таблицей в одном SQL-запросе
$criteria->together = true;
// получение связанных объектов в режиме "жадной" загрузки
$criteria->with = array('profile', 'comments', 'category');
// добавляем условие between (диапазон)
$criteria->addBetweenCondition('post.date_update', '09-12-2011', '09-12-2015');
// добавляем условие для сравнения переданного списка со значениями столбцов
$criteria->addColumnCondition(array('status'=>1), 'AND')
// добавляем условие IN к уже имеющемуся (condition)
$criteria->addInCondition('post.category_id', array('6', '24', '247'), 'OR');
// добавляем условие к уже имеющемуся (condition)
$criteria->addCondition("count_comments <= :count_comments");
// сливает критерий с другим
if($_POST['search_text']){
	$criteriaSearch = new CDbCriteria();
	$criteriaSearch->addSearchCondition('description', $_POST['search_text']. true, 'AND', 'LIKE');
	$criteria->mergeWith($criteriaSearch, 'AND');
}
$posts = Post::model()->findAll($criteria);

CDbCriteria в DAO

Для ускорения работы приложения можно отказаться от AR в пользу DAO. Но это накладывает некоторые ограничения, например, придется отказаться от использования together, with - они могут не попасть в результирующий запрос.

$criteria = new CDbCriteria;
$builder = new CDbCommandBuilder(Yii::app()->db->getSchema());
$command = $builder->createFindCommand('post', $criteria);
$result = $command->queryColumn();//query(), queryAll(), queryRow(), queryScalar()

Добавить комментарий

Все комментарии

Дмитрий
09 июля 2014 23:47
Спасибо, отличная информация!
Ответить
comments powered by Disqus