Примеры использования CDbCriteria в Yii
CDbCriteria - это набор правил, критериев, по которым строится запрос, обычно 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). |
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 экранировать ли слово для поиска, если оно содержит символы % или _. $operator оператор, используемый для соединения нового условия с имеющимся. По умолчанию - 'AND' $like оператор LIKE. По умолчанию - 'LIKE'. Можно установить в значение 'NOT LIKE' |
Добавляет условие поиска к уже имеющемуся (condition). Условие поиска и имеющееся будут соединены определенным оператором, по умолчанию - оператор 'AND'. Условие поиска генерируется с использованием SQL-оператора LIKE с переданным именем и словом для поиска |
compare($column, $value, $partialMatch=false, $operator='AND', $escape=true) |
Оператор сравнения определяется интеллектуально на основе первых нескольких символов переданного значения. Примечание: окружающие пробелы будут удалены из значения перед сравнением. $column имя столбца для поиска $value значение, с которым производится сравнение. Если значение является строкой, то $partialMatch надо ли проверять значение на частичное совпадение (используя операторы LIKE и NOT LIKE). $operator оператор, используемый для соединения нового условия с имеющимся. По умолчанию - 'AND' $escape должно ли значение экранироваться, если свойство $partialMatch установлено в значение true и |
Добавляет выражение сравнения к свойству 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()
Все комментарии