Yii 實現兩種模型,均繼承 CModel:
class Post extends CActiveRecord {
public static function model($className=__CLASS__) {
return parent::model($className);
}
public function tableName() { return '{{post}}'; } // {{}} 自動替換表前綴
public function primaryKey() { return 'id'; }
}
| 操作 | 代碼示例 |
|---|---|
| 新增 | $p=new Post; $p->title='t'; $p->save(); |
| 查詢單條 | Post::model()->findByPk(10) / findByAttributes(['title'=>'abc']) |
| 查詢多條 | Post::model()->findAll($criteria) / findAllBySql() |
| 更新 | Post::model()->updateAll(['title'=>'new'], 'id=1') |
| 刪除 | $p=Post::model()->findByPk(10); $p->delete(); |
| 事務 | $tx=$model->dbConnection->beginTransaction(); ... $tx->commit(); |
$criteria = new CDbCriteria();
$criteria->select = 'title';
$criteria->condition = 'postID=:pid';
$criteria->params = [':pid'=>10];
$post = Post::model()->find($criteria);
class LoginForm extends CFormModel {
public $username, $password;
public $rememberMe = false;
public function rules() {
return [
['username, password', 'required'],
['rememberMe', 'boolean'],
['password', 'authenticate'], // 自定義驗證方法
];
}
public function authenticate($attr, $params) {
if (!$this->hasErrors()) {
$identity = new UserIdentity($this->username, $this->password);
if (!$identity->authenticate())
$this->addError('password', '密碼錯誤');
}
}
}
僅出現在驗證規則中的屬性才是「安全」的,允許 $model->attributes = $_POST['LoginForm'] 批量賦值。需暴露無驗證屬性時用 ['content', 'safe'];需排除用 ['permission', 'unsafe']。
<?php $form=$this->beginWidget('CActiveForm'); ?>
<?= $form->labelEx($model,'username') ?>
<?= $form->textField($model,'username') ?>
<?= $form->error($model,'username') ?>
<?= $form->labelEx($model,'password') ?>
<?= $form->passwordField($model,'password') ?>
<?= $form->error($model,'password') ?>
<?= CHtml::submitButton('登錄') ?>
<?php $this->endWidget(); ?>
'db'=>[
'connectionString'=>'mysql:host=localhost;dbname=oss',
'username'=>'root', 'password'=>'hahaha', 'charset'=>'utf8',
'tablePrefix'=>'oss_', 'emulatePrepare'=>true,
],
'log'=>[
'class'=>'CLogRouter',
'routes'=>[
['class'=>'CWebLogRoute', 'levels'=>'trace, info'], // 頁面底部顯示 SQL
],
],
AR 模型承擔核心業務與持久化,表單模型處理輸入驗證與臨時數據。善用 rules()、safe/unsafe、CDbCriteria、事務,能構建健壯、安全的數據層。