MVC架构之model类:
我的日报系统用到的数据表:tbl_dailyreport表
其中anthor_id是外键,对应tbl_user数据表的主键id,下面是tbl_user表
class Dailyreport extends CActiveRecord可以看出model类全是继承自CActiveRecord类,这个基类太重要了,下面我们来研究一下。
首先,rules()方法:返回一个数组array
{return} | array | validation rules to be applied when validate() is called. |
它的作用是在验证model信息时的验证规则。
1 public function rules() 2 { 3 // NOTE: you should only define rules for those attributes that 4 // will receive user inputs. 5 return array( 6 array('content', 'required'), 7 array('content','length','min'=>10), 8 array('author_id', 'numerical', 'integerOnly'=>true), 9 // The following rule is used by search(). 10 // Please remove those attributes that should not be searched. 11 array('author_id', 'safe', 'on'=>'search'), 12 ); 13 }
required是必须要填写的,其实时间create_time也是必须要有的,但是在数据库里设置了自动填入当前时间,所以在这里就可以不用说明。length比如大于10个字,author_id必须为数字,'on'=>'search'是说明该字段是否可以作为搜索条件,这里设置只用author_id搜索,其实我们用的是author,也就是用的名字,而不是id,这个在后面会讲怎么实现的。
下面是User类中的relations()方法
1 public function relations() 2 { 3 // NOTE: you may need to adjust the relation name and the related 4 // class name for the relations automatically generated below. 5 return array( 6 'dailyreports' => array(self::HAS_MANY, 'Dailyreport', 'author_id'), 7 'project' => array(self::BELONGS_TO, 'Project', 'projectid'), 8 'room' => array(self::BELONGS_TO, 'Room', 'roomid'), 9 'is_true'=>array(self::BELONGS_TO,'Bool','receive_email'), 10 'is_true1'=>array(self::BELONGS_TO,'Bool','receive_remind'), 11 ); 12 }
格式:'varName'=>array('relationType', 'className', 'foreign_key', ...additional options)
varName就是得到的属性名,可以通过当前的类直接调用;relationType是关系,比如self::HAS_MANY是包含很多的意思,比如一个user会有会多条日报,它们是通过外键anthor_id连接的,self::BELONGS_TO是属于的意思,比如一个user只有一个room,外键关系是roomid;
foreign_key是外键;
additional options是其它的条件,一般是作为筛选信息的条件,
比如:'dailyreports' => array(self::HAS_MANY, 'Dailyreport', 'author_id','order'=>'create_time desc'),
对于得到的 dailyreports,我们可以这样用
$dailyreports=$user->dailyreports; foreach($dailyreports $dailyreport) echo $dailyreport->content;
我们通常需要获得一个model中的一些字段值,下面的方法是经常用到的,是在User类中定义的:
1 public static $_items=array(); 2 public static function items() 3 { 4 $models=self::model()->findAll(); 5 foreach($models as $model) 6 self::$_items[$model->id]=$model->name; 7 return self::$_items; 8 } 9 public static function roomitems() 10 { 11 $rooms=array(); 12 $models=self::model()->findAll(); 13 foreach($models as $model) 14 $rooms[$model->id]=$model->roomid; 15 return $rooms; 16 } 17 public static function projectitems() 18 { 19 $projects=array(); 20 $models=self::model()->findAll(); 21 foreach($models as $model) 22 $projects[$model->id]=$model->projectid; 23 return $projects; 24 } 25 public static function item($author_id) 26 { 27 $criteria=new CDbCriteria; 28 $criteria->condition='id=:id'; 29 $criteria->params=array(':id'=>$author_id); 30 $model=self::model()->find($criteria); 31 self::$_items[$model->id]=$model->name; 32 return self::$_items[$author_id]; 33 }
比如:items()方法就是得到User的id与name对应的array,用的是CActiveRecord基类中的findAll()方法,与find()方法类似,不过返回的是多条记录。roomitems()方法等类似。
item()方法中用到的CDbCriteria基类也是非常重要的。
CDbCriteria基类有很多属性:condition,select,params,order,distinct,join,having等数据库sql语句中常见的操作。可以给find(),findAll()等方法赋值$criteria进行查询,后面会经常用到。
1 public function beforeSave() 2 { 3 if(parent::beforeSave()) 4 { 5 if($this->isNewRecord) 6 { 7 $this->author_id=Yii::app()->user->id; 8 } 9 return true; 10 } 11 else 12 return false; 13 }
beforeSave()是一个事件,在保存到数据库之间执行,有些值可以在这赋。
未完待续。。