Yii 的 ActiveRecord 模式中,find() 返回單個模型對象,findAll() 返回對象數組。默認查詢所有字段,但在大表或高頻接口中,僅選取必要字段能顯著降低內存佔用和網絡傳輸開銷。本文總結多種指定字段的優雅寫法。
$criteria = new CDbCriteria; $criteria->select = 'username, id, email'; $criteria->order = 'id DESC'; $users = User::model()->findAll($criteria);
直接傳遞關聯數組,代碼更簡潔,支持鏈式調用:
// findAll 多條記錄
$users = User::model()->findAll(array(
'select' => array('username', 'id', 'email'),
'order' => 'id DESC',
));
// find 單條記錄
$user = User::model()->find(array(
'select' => array('username', 'id', 'email'),
'order' => 'id DESC',
'condition' => 'id = :id',
'params' => array(':id' => $id),
));
$users = $this->user->find(array(
'select' => array('id', 'username', 'email'),
'order' => 'id DESC',
'condition' => 'state = :state AND id = :id',
'params' => array(':state' => '1', ':id' => '2'),
));
使用 CPagination 時仍需實例化 CDbCriteria,因為分頁組件依賴 criteria 對象計算總數:
$criteria = new CDbCriteria; $criteria->select = 'id, username'; $criteria->condition = 'status = 1'; $count = User::model()->count($criteria); $pages = new CPagination($count); $pages->pageSize = 20; $pages->applyLimit($criteria); $users = User::model()->findAll($criteria);
$projects = Project::model()->findAll();
foreach ($projects as $project) {
echo $project->attributes['title']; // 或 $project->title
}
$criteria = new CDbCriteria();
$criteria->addInCondition('id', array(1, 2, 3));
$newsTypes = NewsType::model()->findAll($criteria);
limit/offset 或游標迭代