申明关系
两张表之间的关系无非三种:一对多;一对一;多对多; 在AR中,定义了四种关系:
关系 | 定义 | 例子 |
---|---|---|
BELONGS_TO | A和B的关系是一对多,那么B属于A | Post属于User |
HAS_MANY | A和B之间的关系是一对多,那么A有多个B | User有多个Post |
HAS_ONE | 这是HAS_MANY的一种特殊情况,A至多有一个B | User至多有一个Profile |
MANY_MANY | 这个对应多对多的情况,在AR里会将多对多以BELONGS_TO和HAS_MANY的组合来解释 | Post和Category |
在AR中通过重写CActiveRecord类的relations()方法来申明关系;这个方法返回一个关系配置的数组;一个数组无素代表一个单独的关系,格式如下:
在AR中通过重写CActiveRecord类的relations()方法来申明关系;这个方法返回一个关系配置的数组;一个数组无素代表一个单独的关系,格式如下:
'VarName'=>array('RelationType','ClassName','ForeignKey', ...additional options)
Var Name | 关系名 |
---|---|
Relation Type | 四种关系:self::BELONGS_TO, self::HAS_ONE, self::HAS_MANY, self::MANY_MANY |
Class Name | 代表当前AR类要关联的那个AR类名 |
Foreign Key | 实现关系的外键, 有可能有多个,即列名 |
下面的代码表示用来定义Post, User之间的关系
class Post extends CActiveRecord
{......public function relations(){return array('author'=>array(self::BELONGS_TO, 'User', 'author_id'),'categories'=>array(self::MANY_MANY, 'Category','tbl_post_category(post_id, category_id)'),);}
}class User extends CActiveRecord
{......public function relations(){return array('posts'=>array(self::HAS_MANY, 'Post', 'author_id'),'profile'=>array(self::HAS_ONE, 'Profile', 'owner_id'),);}
}