Методы моделей для поиска данных find в Yii

30.08.2013

Пожалуй самые часто используемые методы у моделей во фреймворке Yii, это find. Они используется для выборки данных из БД и подгрузки их в модель(и). В этой заметке мы кратко рассмотрим все методы поиска как одной, так и нескольких записей.

Поиск одной записи (find)

Предположим у нас есть в БД таблица с названием Ankets. Мы создали для неё модель Anketa и теперь попробуем выбрать одну анкету с id равным 12. Yii предлагает нам 4 способа выбоки анкеты:

$model = Anketa::model()->findByPk(12);
$model = Anketa::model()->find('id = 12');
$model = Anketa::model()->findByAttributes(array('id' => 12));
$model = Anketa::model()->findBySql('SELECT * FROM Ankets WHERE id = 12');

Тут явно лучше использовать первый метод findByPk, он ищет по ключевому полю, а у нас ключевым полем является как раз id. Для поиска по другим полям модели(не ключевым), этот метод не подходит.
В find мы просто пишем условие, которе будет добавлено в WHERE.
findAllByAttributes удобен тогда, когда надо выполнить поиск по нескольким значениям, например по группе и фамилии:

Anketa::model()->findByAttributes(array('group' => 3, 'sex' => 'Ж'));
findBySql требует указания полного запроса, для простых запросов как наш, этот метод не нужен, но знать о его наличии желательно.
А что если под наши условия подходят несколько записей? Тогда метод вернёт самую первую из них

Поиск нескольких записей (findAll)

Для выборки нескольких записей используются похожие методы, параметры они принимают те же, но вместо одной модели возвращают массив моделей:

$models = Anketa::model()->findAllByPk();
$models = Anketa::model()->findAll();
$models = Anketa::model()->findAllByAttributes();
$models = Anketa::model()->findAllBySql();

Собственно и перебирать их можно как обычный массив:

foreach ($models as $model) {...}

find, подробности

Поближе посмотрим на метод find, с помощью него можно искать несколькими способами.

Самый простой способ мы рассматривали выше:

Anketa::model()->find('id = 12');
Указав критерии в массиве:
Anketa::model()->find(array('condition' => 'id = 12'));
С помощью класса $criteria
$criteria = new CDbCriteria;
$criteria->compare('id', 12);
Anketa::model()->find($criteria);

В find, findAll, findBySql и в findAllBySql можно использовать и другие операторы SQL, например сортировку:

Anketa::model()->findAll(array('condition' => 'id = 12', 'order' => 'firstname'));
С использованием CDbCriteria
$criteria = new CDbCriteria;
$criteria->compare('id', 12);
$criteria->order = 'firstname';
Anketa::model()->findAll($criteria);
Указываем сортировку в самом запросе
Anketa::model()->findAllBySql('SELECT * FROM Ankets WHERE id = 12 ORDER BY firstname');

Вот и всё, все методы для поиска записи в Yii похоже друг на друга, и как показано в этой заметке, разобраться с ними не составит особого труда.